==============================================================================
                                AWNPipe - Docs                                
==============================================================================

Index:
======

1 About
2 Read First
3 Pipe Functions
  3.1 Overview
  3.2 Conversion
  3.3 Paths
  3.4 Internal
  3.5 Extensions
  3.6 Tutorials
      3.6.1 Simple
      3.6.2 Advanced
      3.6.3 Tricks
4 GUI Creation
  4.1 Conversation
      4.1.1 Basic
      4.1.2 Step by Step
      4.1.3 Details
  4.2 Objects
      4.2.1 Window
      4.2.2 Simple Gadgets
            4.2.2.1 Button
            4.2.2.2 Integer
            4.2.2.3 String
            4.2.2.4 CheckBox
            4.2.2.5 Chooser
            4.2.2.6 RadioButton
      4.2.3 Images
            4.2.3.1 Label
            4.2.3.2 Glyph
            4.2.3.3 DrawList
            4.2.3.4 PenMap
            4.2.3.5 Bitmap
            4.2.3.6 Image
            4.2.3.7 Space
      4.2.4 Special
            4.2.4.1 Layout(End)
            4.2.4.2 ClickTab
            4.2.4.3 TextAttr
            4.2.4.4 BrowserNode
            4.2.4.5 Menu
            4.2.4.6 Arexx
      4.2.5 Fancy
            4.2.5.1 GetFile
            4.2.5.2 GetFont
            4.2.5.3 TextEditor
            4.2.5.4 TextFeild
            4.2.5.5 ListBrowser
            4.2.5.6 Palette
      4.2.6 More
            4.2.6.1 Fuelgauge
            4.2.6.2 Scroller
            4.2.6.3 Slider
            4.2.6.4 WeightBar
            4.2.6.5 Commodity
            4.2.6.6 Sound
  4.3 Events
  4.4 Modify
  4.5 GUI Tutorial
      4.5.1 Design
      4.5.2 Operation
      4.5.3 Modification
      4.5.4 Extras
      4.5.5 Advanced
      4.5.6 Tips
5 Demos


------------------------------------------------------------------------------
                                   1 About                                    
------------------------------------------------------------------------------

     AWNPipe:   Multifunction Device
     Author:    William H. M. Parker
     Version:   2.54  31 Jan 2001

 AWNPipe is a new kind of ADOS device. It's functions can be accessed from 
almost any program including C, E, Assembler, Arexx, and simple ADOS scripts. 
AWNP has many uses but the most popular is the creation of Graphical User 
Interfaces. Other functions include clipboard support, tooltype access, 
pattern matching, Html conversion, data stream twinning, ...
 Programmers will find that GUI development is VERY fast using AWNP and 
testing various layouts is as easy as editing a text file.

 Programs written using AWNP present the user with a GUI that is easy to use 
and consistent in form. The ease of adding menus, Arexx hosts, help 
information and images encourages authors to add more of the 'Nice' features 
to their programs.

Distribution

 AWNPipe can be freely distributed in the form of this archive, complete and 
unmodified.

 The operational parts (AWNPipe-handler and AWNPipe) may be included in the 
distribution of programs using AWNPipe if the following three conditions are 
met.

1. The distribution contains an install script and the AWNPipe files are 
handled as follows (NOTE the use of 'copylib' for awnpipe-handler).

(copylib
  (source "device/awnpipe-handler")
  (dest "l:")
  (prompt "Installing AWNPipe-handler")
)
(copyfiles
  (dest "Devs:dosdrivers")
  (source "device/awnpipe")
  (prompt "Installing AWNPipe")
  (infos)
)
(working ("Activating AWNPipe:"))
(run "C:assign AWNPipe: dismount")
(run "C:mount AWNPipe:")

2. The docs mention the use of AWNP and the version number of AWNPipe in the 
distribution.

3. The AWNPipe author is notified, bill@amitrix.com .

This software is CHILDWARE. I require whoever uses this program to make a 
donation to a beneficial organization working to help children. If you don't 
know of any, ask at your local post office and learn how to make a payment to 
UNICEF. The amount is up to you, but please do it!

Requirements

 AWNPipe requires ADOS 3.x
 You must have Class Act installed or be using ADOS 3.5+ to use the pipes GUI 
building functions. Class Act can be found on Aminet, or use 
http://www.amitrix.com/AWeb30ca.lha (the latter has been tested for 
compatability with AWNPipe).

Support

 Support is currently available from :

 http://www.yahoogroups.com/community/awnpipe
 http://web.ukonline.co.uk/awnpipe/
 or directly from the AWNP Author, bill@amitrix.com.

History

o AWNPipe-handler Vers 2.53
  -added hook type to string gadget.

o AWNPipe-handler Vers 2.53
  -added 'target' option to 'drawme' modify command
  -added 'idme' keyword to allow tracking of labels,images and space gadgets.
  -added 'bounds' modify query to get object size and location.
  -added 'knob' and 'maxn' to scroller modify

o AWNPipe-handler Vers 2.52
  -fixed handling of &#???; in unhtml function
  -added &quote; and &copy; to unhtml function
  -added '/xz' option to remove html tags <...>
  -added '/xp' option to get information on public screens
  -worked around listbrowser hit when presetting selected nodes
  -added 'xw' fast simple text wrapping
  -taps now wait for both ends of the pipe to close before closing.
  -added patterned backfill support to layout groups
  -added screen to front/back window modify command (GID 0)
  -added BD keyword to arexx host return line

o AWNPipe-handler Vers 2.51
  -added fast release of images used in a button object.

o AWNPipe-handler Vers 2.50
  -added sound object
  -fixed '/v' to handle clips with multiple char chunks.
  -fixed slider modify

o AWNPipe-handler Vers 2.49
  - added label softstyle 'softstyle=' (ss=)
  - added hidechild modify to listbrowser
  - added hidechild modify to browser node
  - removed some duplicate events from attached getfile gadgets
  - fixed bitmap error response
  - removed some extranious 'ok's
  - maximum predefined images increased to 50
  - maximum defined master bitmaps increased to 10
  - maximum layout group nesting increased to 50
  - replacing a listbrowser no longer gives enforcer hits
  - PIPE NAMES ARE NO LONGER CASE SENSITIVE ('/' options should be lowercase)

o AWNPipe-handler Vers 2.48
  - added work around for disable of clicktabs
  - added the ability to disable a single tab of a clicktab
  - fixed docs, disable keyword description was backwards in some places
  - '/m' multiple opens now work when reading data.
  - added '/m' explanation to pipe functions/tutorials/tricks
  - cleaned up docs in various places.
  - added plain text version of these docs
  - added Amiga Guide version of these docs
  - fixed bug in XO.rx demo

o AWNPipe-handler Vers 2.47
  - added '/xs' (seticon)  ability to write icon tooltypes, position, type, 
and defaultool
  - expanded tutorial5 to cover writing tooltypes
  - GUI advanced doc has been expanded

o AWNPipe-handler Vers 2.46
  - trailing '/' in no longer required in drawers only getfiles.
  - fixed asl getfile loss of initial title
  - fixed asl getfile missing space in event
  - fixed asl getfile retention of pos and neg text
  - worked around for missing refresh in multiselect listbrowser

o AWNPipe-handler Vers 2.45
  - expanded drawlist commands (changed some directive values as well)
  - corrected Browsernode and listbrowser docs
  - added refresh ability to browsernodes
  - fixed multiselect listbrowser bug

o AWNPipe-handler Vers 2.44
  - fixed bug ScreenTitle could be trashed when setting WindowTitle.
  - binary data for GUI is no longer limited to 10000 bytes
  - added '/xt' option to query icon tooltypes
  - fixed bug An extra 'ok' was returned when an addnode modify line included 
sc=
  - expanded readme file
  - tutorial 5 now checks tool types of its icon
  - Advanced GUI tutorial text updated
  - Added sanity check, you can't force gadget refresh while window is 
iconified
  - The dictionary demo is now a thesaurus as well 
(docs/demos/dict-thesar.rx)

o AWNPipe-handler Vers 2.43
  - fixed return from commodity modify.
  - Added underscore keyword to label image

o AWNPipe-handler Vers 2.42
  - Added Commodity Object, see GUI Creation/Objects/More.
  - Tutorial 5 is now a commodity.
  - Tutorial 5 is now an arexx host.
  - updated advanced gui tutorial docs.

o AWNPipe-handler Vers 2.41
  - added order modify keyword to retrieve the order of nodes in a list 
browser
  - the CAList demo is now called GUIList and a short doc file added
  - the FontToy demo has been updated and a short doc file added

o AWNPipe-handler Vers 2.40
  - fixed bug in ASL getfile title modify
  - added some important text to the getfile docs.
  - fixed bug, GUI Host could hang on selection of invalid browsernode
  - fixed bugs ASL getfile, height parameter, filename
  - added function, removenode now works with list detached
  - Listbrowsers can now be sorted by two fields at once.
  - added option to set positive text is ASL getfile
  - added option to set negative text is ASL getfile
  - No more deadlocks when a read is pending on both ends of a pipe !!!
  - refined help window size and placement

o AWNPipe-handler Vers 2.39
 - added '/Xea' option to generate keystrokes from a simple ANSI source.
 - fixed arexx host creation (could cause enforcer hits)
 - changed fonttoy demo

o AWNPipe-handler Vers 2.38
 - oops 2.37 has new 'beep' modify command to flash screen(s).
 - added keystroke event generator.  '/Xe'
 - added keystroke filter and notification '/Xk'
 - optimized A4 initialization for faster handler.

o AWNPipe-handler Vers 2.37
 - added 'bufferpos' to read cursor position in string gadgets.
 - fixed bug, unmatched commands to an arexx host could cause software 
failure.
 - fixed cut and paste tutorial text in the docs.
 - expanded tutorial 5 teaching about ARexx hosts.
 - added sliders to gadgets 3 demo.

o AWNPipe-handler Vers 2.36
 - started real history record
 - added 'askclose' to window definition to stop window close button from 
actually closing the window.
 - added 'bubble' modify command to open a help bubble.
 - added cursor position to help events.
 - added 'ASL' option to getfile to use an ASL rather than ClassAct/Reaction 
based requester.
 - added work around for the fact CA/Reaction GetFile and GetFont can trash 
the GUI when help events are enabled.
 - added tutorial 5 teaching bubble help.
 - added 'weightbar' gadget..
 - 'label' and 'bitmap' now return the created image size.

o AWNPipe-handler Vers 2.33 and earlier
 - added 'draw' modify command to draw images manually into GUI.
 - added 'refresh' events to window to allow refreshing of manually drawn 
images.
 - added 'mouse' modify command to read mouse position.
 - added 'slider' gadget type.
 - added REAL menu bars.
 - made menu mutilselect.
 - extended appwindow support to allow dropping of a group of icons.
 - added some 'C' based tutorials, anyone using awnp from 'C' please contact 
the AWNP author.
 - added unit number option to '/v' and '/c' reading and writing the 
clipboard.
 - fixed bug in modification of scroller gadgets.
 - added a bunch of new modify commands for list browsers.
 - added command to read the  contents aof a list node.
 - added 'TextEditor' gadget type.

Origin

 AWNPipe was originally developed as a way to speed up the execution of my 
ARexx script AWebNews.awebrx. As I continued writing scripts I added more and 
more functions to the pipe. Some of the functions have proven useful to 
others writing Amiga prpgrams. I built these docs in the hope that AWNPipe: 
will be of use to Amiga programmers in general.

Acknowledgements

 I would like to thank Gabriele Favrin (author of HTTX) for his input, 
testing and constant encouragement while writing AWNPipe.

 I also thank...

 Bruce Steers for maintaining the AWNP support page and finding many subtle 
bugs.

 Nils Goers for his testing under ADOS 3.5 and developing his wonderful 
program T.H.E. using AWNP, as well as his bug reports.

 Bernd Gollesch for writing the script that creates the Amiga Guide and plain
text versions of the docs automagicaly.

 Everyone else who provided bug reports or feed back helping me make AWNP 
better.

Bill

------------------------------------------------------------------------------
                                 2 Read First                                 
------------------------------------------------------------------------------

 AWNPipe itself is stable and quite well tested. These docs are still a work 
in progress so please excuse typos and omissions.

 At first glance AWNPipe may appear complex. Actually each of the functions 
in the pipe are simple to use when taken individually. Don't try to learn 
everything at once, pick a single function and try it out. Each function can 
be used without knowing anything about the other functions.

 Most of you will be primarily interested in building and operating GUI's. 
You can go directly to the GUI Creation section and start there. The 
important part to read about is the conversation, then try the tutorials in 
that section.

 To learn about pipe functions go straight to Pipe Functions/Tutorials/Simple 
and work through the examples.

 Right Amiga C can be used to cut and paste example text from the docs. This 
helps to avoid typos.

Feel free to contact me, <bill@amitrix.com>, with your questions and 
comments.

 Have Fun !

------------------------------------------------------------------------------
                               3 Pipe Functions                               
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                 3.1 Overview                                 
------------------------------------------------------------------------------

 The pipe function sections are NOT required reading to learn how to build 
GUI's.

 Using AWNPipe
 -------------

All of AWNPipes functions are accessed through a pipe like interface as the 
name implies. Pipes are accessed like any other type of file using open, 
close, read, and write. From Amiga DOS a pipe can be used almost any place 
you would normally use a file name.

The name of each pipe starts with the device name 'awnpipe:'. This is 
followed by a unique name that is used to identify the pipe. The name MAY 
also be followed by a '/' and some option information to give the pipe 
special abilities. 'awnpipe:myfile' and 'awnpipe:test' are examples of pipe 
names.

The options after the '/' usually cause the data to be altered as it passes 
into the pipe. Then data you read out from the pipe will be different than 
the data you wrote into it. The '/h' function works this way, any '&' written 
into the pipe will be read back as '&amp;'.

Some other options connect the pipe to special hosts like the clipboard. Data 
written to a pipe ending in '/c0' goes into the clipboard unit 0. The data 
read from a pipe ending in '/v0' will be the contents of clipboard unit 0.

Here is a simple example showing data going in and out of a pipe.

echo "hello World" > AWNPipe:test
type AWNPipe:test


This following information is intended as a reference for people already 
familiar with AWNP. To learn how to use pipe functions work through the 
tutorials.

 Pipe Types
 ----------

/i immediate   /u unHTML        /e execute    /l link
/r read        /p Postaweb      /o <option>   /v[unit#] readclip
/w write       /! do not wait   /b backwards  /c[unit#] writeclip
/h HTML        /t tap           /f force      /s status
/g HTML2       /a abort         /-vers# minimum version
/@ seek enable /m Multiple Opens   /1 open first end

/x[option] extra function
      /xc open interactive Class Act pipe
      /xcr[filename] open interactive Class Act pipe, reading the window and 
gadget definitions from a separate file.
      /xcw[filename] open interactive Class Act window, writing the events to 
a separate file.(also sets immediate and force)
      /xm[c]    string pattern match c=case sensitive
      /xm[c]w    string pattern match c=case sensitive results to separate 
file
      /xm[c]r    string pattern match c=case sensitive reading data from 
separate file. (also sets immediate and force)
      /x0 programmable replace loopback
      /x0r[filename] programmable replace from file
      /x0w[filename] programmable replace to file
      /xk remove keystrokes from input event stream and notify
      /xe write keystrokes to the input event stream from code & qual
      /xea write keystrokes to the input event stream from ANSI source
      /xt[filename] query icon tooltypes
      /xi[filename] read tooltype information for a file.
      /xs[filename] set tooltype information for a file.
      /xz remove html tags <...>  loopback
      /xzr[filename] remove html tags <...> from file
      /xzw[filename] remove html tags <...> to file
      /xp get public screen names  loopback
      /xpw[filename] get public screen names to file
      /xw[length] text wrap loopback
      /xw[length]r[filename] text wrap from file
      /xw[length]w[filename] text wrap to file

Details about AWNPipe
---------------------

AWNPipe:test/h AWNPipe:TEST AWNPipe:test/h/f/rhelpme are all the same file. 
The unique name is NOT case sensitive, and terminates on the first '/' or the 
end of the name if no '/' is found. '%' may be substituted for  '/' . Options 
after the '/' should be given in lower case.

A pipe name is usually only opened twice. After that calls to open will fail. 
After both ends of the pipe are closed the pipe name can  be used again. A 
pipe can immediately be written after it is opened, even if the other end has 
not yet been opened. Some special options can override this behavior.

Some types of pipes are only opened ONCE. The second end of these pipes are 
automatically connected to something by the AWNPipe internal code. Clipboard 
access is an example of this type of pipe.

All file handles can both read or write data. A check is made to see if pipes 
dead lock from pending reads on both ends. If this happens both of the 
pending reads are aborted to break the deadlock.

Data flow is never stopped by buffering.

If data is written into a pipe and the second end never opened, the pipe 
stores all written data.... forever  (until you reboot).



------------------------------------------------------------------------------
                                3.2 Conversion                                
------------------------------------------------------------------------------

Data Conversion
----------------

The data passing through the pipe may be modified by the pipe with the 
following options.

H option
========

html conversion - some special characters are translated into html tokens.
& > <  become &amp; &lt; &gt;
This option must be specified on the file handle that is written.

copy ram:test AWNPipe:test/h
copy AWNPipe:test ram:test2


G option
========

The same as the H option above, except that any special html character 
preceded by an '@' is not converted. The preceding '@' is removed during the 
translation process.

U option
========

UNhtml conversion - some html tokens are translated into special character.
&amp; &lt; &gt; become & > <
Tokens of the form &#NUM; are also translated.
This option must be specified on the file handle that is written to..

copy ram:test AWNPipe:test/u
copy AWNPipe:test ram:test2

P option
========

AWebPost conversion - some special characters are translated into standard 
ascii. This must be specified on the file handle that does the writing.

copy ram:test AWNPipe:test/p
copy AWNPipe:test ram:test2

B option
========

backwards blocks - characters read from a pipe are returned in reverse order
of the character blocks written. This must be specified on the
file handle that does the reading.

if you write 5 blocks of characters .....

'hello'
'world'
'1'
'2'
'3'

they are read back as

321worldhello

Funny things can happen if you read before all writes are completed.

O option
========

 Adds the text '<option>' after every '0a'x . I use it in AWebNews.

copy ram:test AWNPipe:test/o
copy AWNPipe:test ram:test2


------------------------------------------------------------------------------
                                  3.3 Paths                                   
------------------------------------------------------------------------------

Controlling data paths.
-----------------------

T option
========

TEE's or data taps. A tap is a extra read handle on a pipe connection. If the 
pipe is not yet created the tap will wait for it to be created. A tap does 
not see any data written to the pipe before the tap was created. Taps are 
useful to listen in on interactive (2way) pipes as they read the data written 
to both ends of the pipe.

Try this is 3 separate shells.

type AWNPipe:test/t
type AWNPipe:test
echo > AWNPipe:test "test data"


R option
========

Read a file. The second end of a pipe can be connected to file automatically. 
The file name is given after the 'R'.

Create a file 'ram:test' containing some text including the characters '<>&'.
Now try this in a shell.

type AWNPipe:test/h/rram:test

The data from ram:test is read through a modifying pipe.

W option
========

Write a file. The second end of a pipe can be connected to file 
automatically. The file name is given after the 'W'.

Create a file 'ram:test' containing some text including the characters '<>&'.
Now try this in a shell.

copy ram:test AWNPipe:test/h/wram:test2

The data from ram:test is copied into a modifying pipe, the pipe 
automatically
outputs the data into a second file ram:test2 .

L option
========

Read AND write to an interactive file such as con: . The interactive file 
name is given after the 'L'.

This is useful to be able to 'tap' into a two way conversation at a con: or 
other interactive file handle. Instead of opening con: directly, open
AWNPipe:test/Lcon:////mycon/
Now you can open AWNPipe:test/t to tap the data exchanged with the con:.

V option
========

This option opens a pipe directly to the clipboard.

type AWNPipe:test/v

You may also specify a clipboard unit, defaults to 0 (the primary clip).

To access clipboard unit 5

type AWNPipe:test/v5


C option
 ========

This option allows you to set the clipboard

echo "set this as the clip" >AWNPipe:test/c

You may also specify a clipboard unit, defaults to 0 (the primary clip)

To set clipboard unit 5

echo "set this as the clip" >AWNPipe:test/c5

E option
========

execute a command . The file name is given after the 'E'. A command is 
executed  with the pipe name as an argument. The pipe name replaces a '%' or 
is placed at the end. You CAN NOT use a '/' instead of a '%' !.

copy ram:test.doc AWNPipe:test/h/eaweb3:aweb-II

copy ram:test.doc "AWNPipe:test/h/eaweb3:aweb-II % config
local"

Both of these load a file ram:test into AWeb through a modifying pipe and 
call AWeb to view it .

Into a file requester such as AWebs save requester...
'awnpipe:jpeg/eUtil:fjpeg_ecs'
will send the data directly to the viewer.



------------------------------------------------------------------------------
                                 3.4 Internal                                 
------------------------------------------------------------------------------

Internal controls.
-----------------

These options control some of the behaviours of AWNP regarding opening pipes 
and reading data.

- option
========

 Specify a minimum version of AWNPipe you need. The format is /-VVRRR where V 
is the version and R is the revision.
 Opening AWNPipe:name/-02009 will fail to open unless AWNPipe is version 2.9 
or newer.

A option
========

 Abort pending reads.  If you try to open a pipe using the '/a' option any 
pending reads are aborted.  This USUALLY causes the pipe to shut so you can 
reuse the pipename. It is seldom if ever needed now since AWNP catches most 
problems and shuts down 'hung' pipes automatically. The open itself ALWAYS 
fails, this is intended.

M option
========

 Multiple opens. When a pipe is opened with this option it behaves normally. 
However when this file handle is closed that end of the pipe becomes 
available to be opened again. If you open the pipe name again with the  '/1' 
(open first end)  flag is set the open call only tries to open the first side 
of the pipe (the end that was opened when the pipe was created). If the 
donotwait flag is set the open call only tries to open the second side of the 
pipe (the end that was NOT opened first). When neither flag is set you get 
the first end of the pipe if available, else you get the second end.

I option
========

 Immediate reads. Reads to the file handle will return if there is any data 
waiting to be read. If you try to read 10 characters from the pipe and only 5 
are available, the read returns with the five characters immediately (rather 
than waiting for 5 more characters to be available). Therefore only a read of 
0 length means end of file. This is useful with data originating  
interactively from con: or ser: .

F option
========

 Force a pipe to be created. A new pipe is created even if the pipe name is 
already is use. The open will not fail, and it will not connect to any 
currently existing pipe end. After both ends of the forced pipe are opened 
any previous partial ( only opened once) pipe of that name becomes available 
again. (ONLY FORCE THE FIRST END OF THE PIPE)

! or ~ option.
==============

 Do not wait. The open will fail unless the other end of the pipe is already 
open. A new pipe will not ever be created. Used on a tap it stops the tap 
from waiting for a matching pipe to be created.

@ option
==============

 Respond to seek packets. Normally seek is not supported by AWNPipe. If see 
is turned on, the current position is reported as '0' if no data is available 
on the pipe, '1' if data is waiting to be read.

 NOTE Do not use this function from ARexx as ARexx has a read ahead buffer
that is flushed when you call seek. This can cause you to loose data. It may
also happen in other languages if read data is buffered.

S or s option
==============

Status of a pipe. This MUST always be a tap as well. Read only returns a 
single byte. This is the status of the real pipe the tap refers to. The 
bits/nibbles or byte meanings are as follows.

'FF' indicates  file handle does not exist. (you can check just the high bit)

low nibble = First end that is opened.
high nibble =second end opened.

in each nibble

bit 4 always zero when FH exists
bit 3 FH opened.  (nibble&4)
bit 2 FH closed.  (nibble&2)
bit 1 FH data available.  (nibble&1)  sub for WaitForChar in AREXX.

Note 'FF' indicates no file handle active.



------------------------------------------------------------------------------
                                3.5 Extensions                                
------------------------------------------------------------------------------

X or x option
==============

These options let you open a pipe whose second end is connected to various
special hosts. (you only open these pipes once)

The X option is always followed by additional character(s). The second 
character determines what type of pipe is opened.

Xw[length][(r|w)filename]  (simple text wrap)
---------------------------------------------

 This pipe wraps text at 'length' characters. It DOES NOT rewrap (lines
shorter than length chars are not joined into longer lines. Length defaults
to 80 if it is not specified.

 When using this function in loopback mode each 'chunk' of text to be wrapped 
MUST end in a linefeed. This allows the same pipe to be used to wrap several 
seperate 'chunks' of text. (loopback mode is when you do not use 
[(r|w)filename])

X0[(r|w)filename]  (Programmable replacement)
---------------------------------------------

 Programmable replacement of a character. A single character is looked for in 
data written to the pipe and replaced by a multy character string.

 First write two bytes to the pipe. the first byte is always '1' the second 
byte is the target character to be replaced. Then write a byte giving the 
length of the replacement string (<=255) followed by the replacement string. 
Do NOT include a terminating null .

 Data written to the pipe after this point is echoed back to the pipe with 
any occurrences of the target character replaced by the specified string.

 X0wfilename causes the data to be echoed to a file rather than back to the 
pipe.

 X0rfilename causes the data to be read from a file rather than from the 
pipe. Note that the target character and replacement string is still read 
from the pipe not the external file. Only data to be parsed and replaced is 
read from the file.

Xz[mode][(r|w)filename] (process html)
-----------------------------------------------------

 The function used depends on 'mode'. Mode is a bitmaped decimal.

bit 1 (1)- Remove all characters between '<' '>' including the '<' and '>'. 
Condence
bit 2 (2)- condence multiple spaces to a single space
bit 3 (4)- do not condence at the start of a line.
bit 4 (8)- replace '0a' characters with spaces
bit 5 (16)- replace '0d' characters with spaces
bit 6 (32)- replace tab characters with spaces
bit 7 (64)- replace <br> and <p> with newline characters
bit 8 (128)- format tables with newlines <td> <th> <table> <tr>
bit 9 (256)- format lists with newlines <li> <ul> <ol>

 The rest of the characters pass unaltered. Sum the numbers in brakets to 
select 'mode'. Mode defaults to 511 (all on).

 EXAMPLE: Writing '1<2>3' to the pipe returns '13'.

 Xzwfilename causes the data to be echoed to a file rather than back to the 
pipe.

 Xzrfilename causes the data to be read from a file rather than from the 
pipe. Note that the target character and replacement string is still read 
from the pipe not the external file. Only data to be parsed and replaced is 
read from the file.

Xp[(w)filename]  (get public screen information)
------------------------------------------------

 This pipe is only read, never written to.

 This pipe returns the name of the front public screen on the first line.
 The default public screen name on the second line.
 Then information on ALL public screens follows, two lines each screen. The 
first line has the screen name, the second the following information 'Top 
Left Height Width Flags ScreenMode'
 All values are given in hexidecimal.

 Example: 'type awnpipe:/xp'

DM.1                          (front screen)
Workbench                     (default screen)
Workbench                     (1st screens name)
0 0 320 4B0 4651 4002         (1st screens info)
AWeb                          (2nd screens name)
0 0 320 258 4652 6002         (2nd screens info)
DM.1                          (3rd screens name)
0 0 320 258 4652 6002         (3rd screens info)
DM.2                          (4th screens name)
0 0 320 258 4652 6002         (4th screens info)
TURBOTEXT                     (5th screens name)
0 FFFFFF14 2CA 1D8 6212 F004  (5th screens info)

 Xpwfilename causes the data to be echoed to a file rather than back to the 
pipe.

ICON HANLDING
========================

Xt[filename]   (find Tooltypes)
-------------------------------

 This host is the best suited to quickly check for tooltypes and get there 
values.

 The icon file for the specified file (you do NOT add '.icon') is queried.

 Open the file awnpipe:myname/Xt[filename]. Write a line containing the 
tooltype you wish to query to the pipe. Read back a response line.

 If no icon file is found an eof is returned.

 If the tooltype is NOT found you will read back a null line (only a <cr>).

 If the tool type IS found you will read back 'ok ' followed by the tooltypes 
value (if it has one).

Xi[filename]   (Icon information)
---------------------------------

 This host will retrieve fuller details about tooltypes and some other icon 
information. It is often used in combination with the following host.

 The icon file for the specified file (you do NOT add '.icon') is read. The 
pipe returns the following lines...

icon_type x y stack
default tool
tool window
first tooltype
second tooltype
...

If no icon file is found  no data is returned. Note that for blank lines will 
be returned when the information does not apply to that icon type.

example: awnpipe:/xidevs:dosdrivers/awnpipe  returns

4 3 139 4096
C:Mount

ACTIVATE=0

To get information on a volume (say dh1:) use 'awnpipe:/xidh1:disk'.

Xs[filename]  (Set icon information)
------------------------------------

 This host will alter or create the icon and tooltypes for the specified 
file.
Data is written to the host in the same format as returned by the preceding
host.

icon_type x y stack
default tool
tool window
first tooltype
second tooltype
third ...

Icon_type, x, y, and stack are all integer values written on a single line.

Default tool and the tooltypes are ascii strings.

Tool window is ignored but MUST still be included, either use a blank line 
('0A'x) or used the data returned by the Xi host.

The first three lines are always required. You may set as many tooltypes as 
you like including none.

some useful information:

setting x and y to -2147483648 unsnapshots the icon.
icon_type 1=disk 2=drawer 3=tool 4=project 5=trashcan

Xm[c][(r|w)filename]  (pattern Matching)
----------------------------------------

 Pattern match Conversation. This conversation supports full ADOS pattern 
matching. The trailing 'c' will make the match case sensitive.

 Xmwfilename causes the match result to be sent to a file rather than back to 
the pipe.

 Xmrfilename causes the data to be read from a file rather than from the 
pipe. The match results are read back from the pipe.

NOTE: the replies are ascii terminated with a newline.

Write the pattern to the pipe terminated with a newline. (<500 chars) The 
pipe returns 'ok 1' when you sent a valid pattern to match to. It returns 'ok 
0' if you did not send a pattern ( the pipe will look only
for exact matches).

write a string to the pipe terminated with a newline.(<500 chars) read the 
reply  '0' (no match) '1' (is a match)

write as many stings as you like . Close pipe to end. The terminating 
newlines are ignored while matching.

KEYSTROKE HANDLING
==================

Xk      (Keystroke filter)
--------------------------

 Filter keystrokes from the input device event stream and receive 
notifications of the keystroke.

 First write a byte to the pipe setting the priority of the key parse 
handler. It is a signed byte -128 to 127. If you are not sure what you want 
use 51 (0x33).

 Next  write a byte to the pipe indicating how many keystrokes to filter. The 
maximum is 255 (0x'ff'). 0 is NOT valid.

0x'0a' is 10 keys.

 Then write two bytes to the pipe indicating how often a null match should be 
sent (to stop your task waiting forever for a match that never happens).

 0x'0032' is 50/100s of a second.

 Now write 4 bytes defining each key you wish to be notified of.  The first 
two bytes are the key the second two bytes are the qualifier.

 Writing 0x'00200001' to the pipe sets the 'a' key 'leftshifted' to be 
filtered from the event stream.

 You MUST set exactly the same amount of keys as specified above.

 Once the setup is complete you read notification from the pipe. Each 
notification is 1 byte giving a match number, the first keystroke you 
specified is 1, the second 2 ...

 A byte of 0 is a null event, no match occurred.

 Close the pipe to end key filtering. NOTE the keyparse handler actually does 
not get removed until the NEXT match or null event.

Xe   (key Event generator)
--------------------------

 Write keystrokes to the input device event stream.

 Each keystroke is sent by writing 4 bytes to this pipe. The first two bytes 
are the key the second two bytes are the qualifier.

 Writing 0x'00200001' to the pipe sends the 'a' key 'leftshifted'.

 You may close the pipe at any time.

Xea   (key events form Ascii)
-----------------------------

 Write keystrokes to the input device event stream from a string source.

 Each keystroke is sent by writing a byte to this pipe. You do NOT need to 
write one character at a time. Simply write ascii text to the pipe and it 
will generate keystrokes as if the string had been typed at the keyboard.

 This is easier than writing keycodes and qualifiers to the pipe but you can 
not generate 'special keystrokes' like Alt-F10 .

 You may close the pipe at any time.

Xc[(r|w)filename]    (ClassAct/Reaction host)
---------------------------------------------

 ClassAct Window Conversation. The Window and gadgets are defined by writing 
to the pipe:. Gadget hits and error/confirmation information is read from the 
pipe. A filename may also be given. If the file is specified as write 'w' the 
output of the pipe is directed to that file. If the file is specified as read 
'r' the window and gadget definitions are read from the file.

 See the GUI Creation section of the docs for details.

------------------------------------------------------------------------------
                                3.6 Tutorials                                 
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                 3.6.1 Simple                                 
------------------------------------------------------------------------------

HINT: Drag select the text then use right Amiga C to copy the examples out of 
these docs. This helps avoid typos.
---

The simplest use of awnpipe is as an ordinary pipe. That means put data into 
one end of a pipe and read it out the other.

In a shell type 'echo >awnpipe:mypipe hello'
Now type 'type awnpipe:mypipe'

The word hello went into the pipe from the echo command, and came out with 
the type command.

'mypipe' was the name of the pipe. More than one pipe can exist at the same 
time.

In a shell type 'echo >awnpipe:mypipe1 hello'
In a shell type 'echo >awnpipe:mypipe2 goodbye'
In a shell type 'type awnpipe:mypipe1'
In a shell type 'type awnpipe:mypipe2'

Two pipes each with a different name.

---

Make sure you have two different shells available.

In the first shell type 'type awnpipe:mypipe'
In the second shell type 'echo >awnpipe:mypipe hello'

You opened the read end of the pipe first. The type command waited until data 
was available from the pipe THEN returned.

A word of caution. Don't try to read from both ends of the pipe at the same 
time. If you 'type awnpipe:mypipe1' in two separate shells both will hang 
waiting for data to come from the pipe. AWNPipe notices this and cancels both 
reads to break the deadlock, this causes both type commands to end without 
typing any data.

---

To use AWNPipe for other functions you add '/' followed by some parameters to 
the pipe name.'/h' will cause the pipe to translate a few special characters 
to there HTML equivalents. Note that the '/h' is only used when writing to 
the pipe.

In a shell type 'echo >awnpipe:mypipe/h "& > <"'
In a shell type 'type awnpipe:mypipe'

The data is modified as it pass through the pipe.

See the advanced examples for more types of data conversion.

---
It is possible to have a pipe automatically connect it self to a file. In 
these cases you only open the pipe on one end, the other end is automatically 
connected to a file.

'/rFILENAME' reads the contents of FILENAME and places it in the pipe.

Create a file 'ram:test' containing some text including the characters '<>&'.

Now try this in a shell.

type AWNPipe:test/h/rram:test

(YES there are two colons ':' in the pipename. Strange but don't let it bug 
you.)

The data from ram:test is read through a modifying pipe.

---

'/wFILENAME' writes the output of the pipe to FILENAME.

In a shell type 'echo >awnpipe:mypipe/h/wram:AWNPtest "& > <"'

Take a look at the file ram:AWNPtest (with your favorite text editor).

---

'/u' reverses the translation done by '/h' and '/rFILENAME' reads data into a
pipe.

In a shell type 'type awnpipe:mypipe/u/rram:AWNPtest'

The contents of the file are read and translated.

---

It is possible to have a pipe automatically connect it self to the clipboard.

In a shell type 'echo >awnpipe:mypipe/c hello'

The word hello was placed into the clipboard. Use your text editor to check 
it out. Then put different text into the clipboard using your text editor.

In a shell type 'type awnpipe:mypipe/v'

 The contents of the clipboard are typed out.


------------------------------------------------------------------------------
                                3.6.2 Advanced                                
------------------------------------------------------------------------------

You should read the simple examples before trying these more advanced ones.

HINT: use right Amiga C the drag then clip the examples out of these docs to 
avoid typos.


---

It is possible to tap into or duplicate the data passed in a pipe. '/t' will 
add a readonly third end to a pipe.

Make sure you have two different shells available.

In the first shell type 'type awnpipe:mypipe/t'

In the second shell type 'echo >awnpipe:mypipe hello'
In the second shell type 'type awnpipe:mypipe '

 The word hello came back from both the second end of the pipe and the 'Tap' 
third end.

---

In the first shell type 'copy con:////pipe-test/close awnpipe:mypipe'
In the second shell type 'type awnpipe:mypipe '

Type a few lines of text into the test con:, nothing comes out in the second 
shell. Close the test con:, now the data comes out. This is because the type 
command wants to read large blocks of data.

'/i' will cause data to pass out of the pipe immediately (as soon as its 
available).

In the first shell type 'copy con:////pipe-test/close awnpipe:mypipe'
In the second shell type 'type awnpipe:mypipe/i '

Now the text comes out of the pipe each time you hit return in the test con:.
Close the test con: to end the example.

---

You can use AWNPipe to read the tooltypes of an icon. The second end of the 
pipe automatically reads the tooltypes of FILENAME when '/xiFILENAME' is 
used. NOTE that parameters that start with '/x' can not be mixed with other 
parameters!

In a shell type 'type awnpipe:mypipe/xiDevs:dosdrivers/awnpipe'

YES the pipe name contains two colons ':', don't let it bug you.

The tooltype information from Devs:dosdrivers/awnpipe prints out. Note you do 
not include '.info' in the file name.

The data is typed out in the following format..

icon_type x y stack
default tool
tool window
first tooltype
second tooltype
...

If you get some weird number (-2147483648) for the X and Y values it means 
you did not snapshot the icon yet.

---

You can also use AWNPipe to write the tooltypes of an icon.

Copy a file with its icon into ram:., preferably an icon that has some 
tooltypes set in it.

In a shell 'copy awnpipe:/xiRam:filename ram:icondump' , do not include 
'.info' in the filename.

Now examine and edit the file ram:icondump change the default tool and 
tooltypes.

In a shell 'copy ram:icondump awnpipe:/xsRam:filename '.

Use the WB menu info function to verify the new setting in the icon.

---

 AWNPipe can be used to pattern match. '/xm' is used for pattern matching. 
Data is usually written into the pipe, and the results of the pattern 
matching read back from THE SAME END OF THE PIPE. The second end of the pipe 
is automatically connected to a task that is doing the pattern matching. 
'/xmrFILENAME' causes the data to be read from a file rather than the pipe, 
the match results are read from the pipe.

In a shell type 'type awnpipe:mypipe/xmrcon:////pipetest/close'

In the pipetest con: type '#?a' . This sets a pattern to match any text 
ending in 'a'. 'ok 1' should come back from the pipe. ('ok 0' would means you 
did not enter a pattern so an exact match will be tested for.)

In the pipetest con: enter some text. If the text ends with 'a' then the pipe 
responds with '1' meaning a match. If not the pipe responds with '0' meaning 
no match. Close the pipe test con: to end the example.

---

 Several functions can be used when processing html documents.

 '/xz' will remove html tags. This means a '<' and all following characters
until a matching '>'.

 Make a simple text file called 'file.html' as follows (or uses any html you 
already have).

'hello <tag>world <another tag>
this is <tag>a test <another tag>
1234567890123456789012345678901234567890'

In a shell 'type awnpipe:/xzrpath:file.html'

 '/xw[length]' allows you to wrap text. (Text parsed from html files is 
usualy unwrapped.)

Use the same file as above.

In a shell 'type awnpipe:/xw5rpath:file.html'
In a shell 'type awnpipe:/xw20rpath:file.html'
In a shell 'type awnpipe:/xwrpath:file.html'

------------------------------------------------------------------------------
                                 3.6.3 Tricks                                 
------------------------------------------------------------------------------


Now for some strange looking but powerful ideas. You don't have to understand 
them all just give them a try. Some interesting things can be done by setting 
a few simple aliases. Some of these aliases take advantage of AWNPipes GUI 
building feature covered in a different section of these docs.

alias see  echo >awnpipe:/xc "defg*nbitmap fn []*nimage*nopen"

Now 'see FILENAME' will display pictures using your datatypes.

alias readtext  echo >awnpipe:/xc "defg a cs *ntextfield a minw 200 minh 200 
gt 0 bd ro datain []*nopen"

Now 'readtext FILENAME' will display a textfile.

alias toolt  type awnpipe:/xi[]

Now 'toolt FILENAME' will display the tooltypes of FILENAME. (do not include 
.info in FILENAME).

alias text2html copy awnpipe:t2h/f/h/r[]

Now 'text2html infile outfile' will create special html sequences for certain 
characters in a text file and save it in a new file.

alias html2text copy awnpipe:t2h/f/u/r[]

Now 'html2text infile outfile' will convert special HTML sequences in a html 
file and save it in a new file.

---

This next example is rather complex and is best studied after you have a 
working knowledge of AWNP.

It might be useful to be able to check an icons tooltype from an ADOS script, 
as earlier examples
have shown the '/Xt' option can do this. There is a problem however. You need 
to write data to the
pipe (the tooltype you wish to check), and read data from the pipe (the 
response to your query).

 It is simple to write data to the pipe with echo.

'echo "filetype" >awnpipe:test/Xtpath:file'

 A pipe connected to path:file.icon is opened and the data 'filetype' is 
written to it. When the echo
command completes it closes the pipe. This breaks the connection to the 
tooltype host and the host
exits. You do not get a chance to read the response from the host.

 The '/m' option (multiple opens) solves this by allowing you to open the 
pipe connection to the
tooltype host more than once.

 'echo "filetype" >awnpipe:test/m/Xtpath:file'

 Again a pipe is connected to the tooltype host is created and sent data. 
This time however when echo
closes its pipe the connection to the host is not lost. AWNPipe knows you 
want to connect to the same
pipe again later.

 'type awnpipe:test'

 This reads the response back from the tooltype host. Note you only specified 
the pipe name, you do
NOT include '/Xtpath:file' again. When the type command completes the 
connection to the host is broken
and the host exits.

 This idea can be taken a step further.

 'echo "filetype" >awnpipe:test/m/Xtpath:file'
 'type awnpipe:test/m'
 'echo "filesize" >awnpipe:test/m'
 'type awnpipe:test/m'
 'echo "filedate" >awnpipe:test/m'
 'type awnpipe:test'

The connection to the host is not broken until you finally open the pipe a 
last time without the '/m'
option.


------------------------------------------------------------------------------
                                4 GUI Creation                                
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                               4.1 Conversation                               
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                 4.1.1 Basic                                  
------------------------------------------------------------------------------

 The sections on the conversation are important but do not try to memorize it 
all. It is enough to understand the general process.

 GUIs are defined and operated by means of a conversation with a special host 
built into the AWNP device. The host is accessed by opening a file . You  
write lines of text to the file and read the file to see the response.

 The GUI is defined by writing text lines to the file. You first write a line 
that defines the window title and other attributes of the window you want to 
create. Now you read back a response line from the pipe to make sure the 
window definition was ok. Next you write a line of text defining a gadget to 
have in the window and read another response line. This line will contain the 
Gadget ID assigned to the gadget you created. You can create as many gadgets 
as you like.
 Once you finish defining gadgets you open the window by writing a line 
containing the single word 'open'. You read back a response line confirm the 
window opened ok.

 Now that the GUI is created and open you simply continue to read lines from 
the file. When the user selects a gadget in the GUI you receive an event line 
containing the GID of the gadget selected and other data such the text 
entered in a string gadget. When the GUI window is closed you receive an 
EndOfFile.

 In some cases you will want to modify a gui after it has already been 
opened. This can be done by writing a lines of text to the file after it has 
been opened or after you read an event. You read a response to the modify 
line.

 For many GUIs you can tell the host to not send any response lines making 
the conversation even simpler. You can just write the GUI definition lines 
then read the event lines.


------------------------------------------------------------------------------
                              4.1.2 Step by Step                              
------------------------------------------------------------------------------

Understanding the conversation is the key to building GUIs with AWNP. Here is 
a walk through the creation and use of a simple example.

  Open the file AWNPipe:myGUI/xc. myGUI can be any name you want.The /xc must 
be used as it tells AWNPipe this file is for GUi creation. From now on I will 
refer to this file as the 'pipe'

Write a Window definition line to the pipe.
'title "My First gui" defaultgadgets'
The line read from the pipe should be
'ok window'
Anything else is an error response.

Write a Gadget definition line to the pipe. 
'button gadgettext "testbutton"
The line read from the pipe should be
'ok 1'
The Gadget ID of the button is 1. If the response line does not start with 
'ok' then an error has occurred.

Write a Gadget definition line to the pipe. 
'checkbox gadgettext "tryme"
The line read from the pipe should be
'ok 2'
The Gadget ID of the checkbox is 2. If the response line does not start with 
'ok' then an error has occurred.


Write open command line to the pipe.
'open'
The line read from the pipe should be
'ok window'
Anything else is an error response.

Now you read an event from the pipe. It will come when the user selects a 
gadget. 

If the checkbox is selected you get the line
'gadget 2 1'
the first word 'gadget tells you the event was from a gadget being hit. 2 is 
the gadgets GID, the 1 at the end tells you the checkbox is now selected.

If the checkbox is selected a second time you get the line
'gadget 2 1'
the first word 'gadget tells you the event was from a gadget being hit. 2 is 
the gadgets GID, the 0 at the end tells you the checkbox is now unselected.

If the button is selected you get the line
'gadget 1 0'
the first word 'gadget tells you the event was from a gadget being nit. 1 is 
the gadgets GID, the 0 at the end tells you the button is not highlighted. In 
this example you can ignore the 0 (button state).

when the GUI window is closed you get the line
'close 0'
the first word 'close' tells you the event was from the window being closed. 
0 (close source) tells you it closed when the close gadget was hit. If the 
user entered <CTRL\>' the close source would be -1. After the close event any 
further attempts to read the pipe will return EndOfFile.

You keep reading events until the end of file is received. You could also 
close the pipe after the close event is read. 


This is a second conversation in which the GUI is modified after it is 
opened. 

  Open the file AWNPipe:myGUI/xc. 
Write a Window definition line to the pipe.
'title "My First gui" defaultgadgets modify'
The modify keyword tells the pipe you want to be able to modify this GUI 
later.
The line read from the pipe should be
'ok window'

Write a Gadget definition line to the pipe. 
'button gadgettext "testbutton"
The line read from the pipe should be
'ok 1'

Write a Gadget definition line to the pipe. 
'checkbox gadgettext "tryme"
The line read from the pipe should be
'ok 2'

Write open command line to the pipe.
'open'
The line read from the pipe should be
'ok window'

After the window is opened you get your first chance to modify it. We want to 
disable the button so we send the following line.
'ID 1 disable 1 refresh'
The button is specified with 'ID 1' and 'disable 1' disables it. The refresh 
at the end tells the pipe to refresh the button so the changes show.
The line read from the pipe should be
'ok'
If the response does not start with 'ok' an error occurred.

We also want the check mark to show as selected so we write the line
'ID 2 selected 1'
The button is specified with 'ID 1' and 'selected 1' turns causes it to be 
checked (the checkmark showing in the box). The refresh at the end tells the 
pipe to refresh the button so the changes show.
The line read from the pipe should be
'ok'

WE have finished modifying the GUI for now so we send a line to tell the pipe 
we are finished sending modify instruction and want to read an event from the 
pipe.
'continue'
The line read from the pipe should be
'ok'

Now you read an events from the pipe.  

If the checkbox is selected you get the line
'gadget 2 0'
The user selected the checkbox gadget, it is now unchecked. We want enable 
the button gadget. AFTER SENDING AN EVENT THE PIPE STARTS READING MODIFY 
INSTRUCTIONS AGAIN. We send the following modify line to the pipe.
'ID 1 disable 0 refresh'
The button is specified with 'ID 1' and 'disable 0' enables it. The refresh 
at the end tells the pipe to refresh the button so the changes show.
The line read from the pipe should be
'ok'
WE have finished modifying the GUI for now so we send a line to tell the pipe 
we are finished sending modify instruction and want to read another event.
'continue'
The line read from the pipe should be
'ok'

If the checkbox is selected a second time you get the line
'gadget 2 1'
The 1 at the end tells you the checkbox is now selected. We want to disable 
the button gadget so we send the line
'ID 1 disable 1 refresh'
The line read from the pipe should be
'ok'
WE have finished modifying the GUI for now so we send a line to tell the pipe 
we are finished sending modify instruction and want to read another event.
'continue'
The line read from the pipe should be
'ok'

If the button is selected you get the line
'gadget 1 0'
WE do not want to modify anything at this time but we still need to send the 
continue line so the pipe will stop looking for modify lines and send us 
another event.
'continue'
The line read from the pipe should be
'ok'

when the GUI window is closed you get the line
'close 0'
The window is closed but we can still send modify commands. For example we 
could read the final state of the gadgets. In this case we will do nothing 
but send the continue line.
'continue'
The line read from the pipe should be
'ok'
Any further reads from the pipe return EOF.

You keep reading an event then sending modify commands until the end of file 
is received. You could also close the pipe after the close event is read. 


------------------------------------------------------------------------------
                                4.1.3 Details                                 
------------------------------------------------------------------------------

 When building a complex GUI you will use objects other than simple gadgets. 
These objects are created the same way as gadgets, by writing a line to the 
pipe and then reading a response. Some of these objects return a GID and some 
simply return an ok.

 You will also handle more types of events than just gadget and close events. 
You can receive menu events, keystrokes, window activation and other types of 
events. These events are handled the same way gadget events are handled.

 A wide range of modify commands can be used. As well as modifying gadgets 
you can iconify the window, read gadget contents, set the windows busy 
pointer and other things. The range of modify commands you use will be 
determined by the type program you are writing.

 Some types of gadget events (textfields, texteditors), and ARexx events 
require special handling since they can be more than one line. The tutorials 
will show you how to handle these events.

 You should now work through the examples. They will not only help you learn 
to use AWNP, they will provide example code you can use for the basis of your 
own GUIs.

------------------------------------------------------------------------------
                                 4.2 Objects                                  
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                 4.2.1 Window                                 
------------------------------------------------------------------------------

The parameters defining the CA window must all be on one line terminated by a 
newline. The pipe will reply with 'window ok'.


screentitle="screen title text"  (st=)

 Set the text for the screen title when CA window is active.

title="window title text"

 Set the title for the CA window.

pubscreen="Screen name"  (ps=)

 Open the CA window on a public screen

IconifyIcon (ii=)

Set the name of the icon to use when you iconify the window.

IconTitle="icon title text"  (it=)

 Set the title for the CA window when iconified.

backfill="filename"  (bf=)

 Image file to use as backfill for window. If backfill is not specified you 
get the default window backfill. Setting backfill="" can be used to have no 
backfill at all. Use this carefully as it overrides the user CA prefs.

NoBorder (NB)

 Make the window borderless.

Quiet  (q)

 Tell the pipe not to reply to the window, gadget definitions, or modify 
commands. This is actually a toggle switch turning replies off and on. SOME 
modify commands are ALWAYS replied to. (addnode and getfile selected 0|1)

NoWindow

 switch to causes no window to be opened. This will not work unless modify is 
set and an arexx object is defined.

NOTE: At times you may want to modify a GUI after is is created, but BEFORE 
the window is opened. Use the 'NoWindow' keyword in the window definition, 
create the GUI as usual. When you send 'open' the window does NOT open but 
you do go into modify mode. Modify the GUI then send 'id 0 s 64' to open the 
window after it has been modified.

app

 Make  this  window a application window.

activate  (a)

 Switch to activate theCA window when it opens.

depthgadget (dg)

 Switch to include a depth gadget on the CA window.

dragbar  (db)

 Switch to include a drag bar on the CA window.

closegadget (cg)

 Switch to include a close gadget on the CA window.

askclose

 Switch to stop the close gadget from actually closing the window. The close 
gadget will generate an 'askclose' event instead. This switch is ignored 
unless modify is also set.

sizegadget (sg)

 Switch to include a window size gadget on the CA window.

iconifygadget  (ig)

 Switch to include an iconify gadget on the CA window.

fullscreen    (fs)
centerscreen   (cs)
topleft         (tl)

 Relative position to open the CA window at. Defaults to centermouse.

top=number
left=number
width=umber
height=number

 Position and size to open  the CA window. Using the left parameter over 
rides the relative positioning above.

vertical     (v)

 Switch to display gadgets vertically, defaults to horizontal.

even    (e)

 Switch to make gadgets/groups all the same size.

defaultgadgets  (defg)

 Switch to include close, depth, size, and drag gadgets on the CA window.

sendkeys  (sk)

 Switch to have the CA window return keystrokes.

sendqual  (sq)

 Switch to have the CA window send qualifier events. (see events.doc)

modify   (m)

 Switch to allow the CA window to be modified AFTER it has been opened.
(See modify parameters below)

help (h)

  Switch to have the CA window return help events.

state

Switch to have the CA window return active/inactive events.

refresh

Switch to have the CA window return refresh events. This is only useful if 
you are doing your rendering directly into the window.

defer

 Switch to defer window layout from the input device to the pipe task. This 
will make input.device more responsive, and drop the (possibly quite 
heavy)process of recalculating the display to normal application priority 
instead of the priority 20 of input.device.

 It also means window refresh is blocked if you are sending modify commands 
to the pipe. The window refreshes AFTER you send 'continue'.

SpaceOuter (so)

 Leave a blank space outside the  root layout of the CA window.

SpaceInner  (si)

 Leave a blank space around elements in the root layout of the CA window.

fixwidth (fw)

 Do not allow the width of the window to be adjusted.

fixheight (fh)

 Do not allow the width of the window to be adjusted.

shrinkwrap (sw)

 Keep all gadgets in the window as close together as possible.

specialchar="character" (sc=)

 'Character' is a single character that replaces '|', in use as a separator 
inside parameters like chooserlabels, tags, penmapdata, ...

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

info

 Include the drawinfo pen array for the screen in the reply to the window 
definition line.

 If successful the reply is

'ok window NUMBERofPENS PEN0 PEN1 ...'

see include:intuition/screen.h for more about drawinfo pens.


Modify GID 0
------------

GID 0 is used to specify the GUI window itself. It can be used in modify 
lines to control certain aspects of the window.

selected=function_bitmap (s=)
This should really have been in HEX but its not for backward compatability.

bit# decimal function

0       1      activate window
1       2      window to front
2       4      window to back
3       8      set window title
4      16      set screen title
5      32      iconify window
6      64      uniconify (or open) window
7     128      Close window (but do not dispose)
8     256      Set busy pointer and disable window
9     512      Clear busy pointer and enable window
10   1024      window to front
11   2048      window to back

You can use more than one function at the same time. 66=uniconify and 
windowtofront.

gadgettext=  (gt=)

 Text for setting screen or window title.

disable=BOOL  (dis=)

 0 enables all gadgets in window.
 !1 disables all gadgets

wide=num
high=num

 Attempt to resize the window to the given width and/or height.Set wide=1 
high=1 to get the minimum size possible.

top=num
left=num

 Move the window to the given position(s).

'ID 0 read'
returns the windows 'left top width height' settings. (width and height 
report as 0 until you get at least 1 event back from the
pipe)

refresh (ref)

 Refresh all gadgets in the window.


------------------------------------------------------------------------------
                             4.2.2 Simple Gadgets                             
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                4.2.2.1 Button                                
------------------------------------------------------------------------------

Button gadget event
-------------------------

'gadget GID selected_state'

selected_state =0 not selected,!=0 selected

Button gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID must point to an ALREADY defined 
text attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number !=0. Defaults to 
enabled.

selected=number (s=)

  The gadget is selected if number != 0 , unselected if number = 0. Defaults 
to unselected.

autobutton=number (ab)

 This button uses a scaled glyph image. The number selects the glyph.

0 POPFILE
1 POPDRAWER
2 POPFONT
3 CHECKBOX
4 CANCELBOX
5 UPARROW
6 DNARROW
7 RTARROW
8 LFARROW
9 POPTIME
10 POPSCREEN
11 POPUP

pushbutton  (pb)

 This button is a pushbutton.

gadgettext="text"  (gt=)

 Set the text of the gadget.

bevel=TYPE  (b=)

 Set the bevel type for this gadget.
0=NONE
1=THIN
2=BUTTON
3=GROUP
4=FIELD
5=DROPBOX
6=SBAR_HORIZ
7=SBAR_VERT
8=BOX
9=STANDARD

leftjustify  (lj)
rightjustify (rj)

 Set the justification of the text for the gadget. Defaults to centerjustify.

minwidth=number  (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number   (weiw=)

 Set the weighted width for this gadget

weightedheight=number  (weih=)

 Set the weighted height for this gadget

nominalsize   (noms)

 Set this gadget to its nominal size.

useimage   (ui)

 Use the last defined image (bitmap/drawlist/penmap) as the gadgets image.

Anim="x|y|wide|high|offsetx|offsety|count"

 Use portions of a bitmap for this gadgets image(s).
x,y              the left and top pixel of the first image.
wide,high        the size of the images.
offsetx,offsety  the offset to the next image.
count            must be 0 for a standard two image button
                 (normal and selected image)

The first image is the gadget graphic, the offset is to the selected image. 
offsets can be 0 to use a single image.

If count!=0 an array of images is produced to allow animation of the button.
If count >0 an array of count images is built. The button image is set to
the first image in the array.
If count <0 an array of absolute value(count)*2 images is built. The button 
image is set to the first image in the array. The selected image is set to 
image absolute value(count)+1.

See the 'animimage' modify parameter for details about animating the button.


FileName='path:file'

 A image file to use as the source bitmap for the anim data. If no file name 
is given an anim is given the bitmap from the previous anim will be reused. 
This bitmap in held in a buffer shared by bitmap images. See the image 
docs-bitmap for more info.

trans

 The animation background should be transparent if the image type allows it.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Button gadget modify parameters.
-------------------------

readonly=number (ro=)

 The gadget is readonly if number = 1 , functional if number= 0. Note that 
this is different handling then in gadget definitions.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

selected=number (s=)

  The gadget is selected if number != 0 , unselected if number = 0.

gadgettext="text"  (gt=)

 Set the text of the gadget.

newimage=number (ni=)

 Replace the gadget image with a previously defined image. If number =0 
replace normal image, else replace selected image.

animimage=number  (ai=)

 When used with the 'newimage' keyword the button image is replaced with an 
image from the buttons image array. The image to be used is specified by 
number.

get=TAG

 Read the value of a specific gadget attribute. Returns a blank line if 
attribute is not readable. This should not be combined with any other modify 
command on the same line.

read

 returns the state of the button

refresh (ref)

 Redraw the gadget.

------------------------------------------------------------------------------
                               4.2.2.2 Integer                                
------------------------------------------------------------------------------

Integer gadget event
-------------------------

'gadget GID integer_value'

Integer gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

TabCycle (tc)

 This gadget can be activated using the tab key.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

arrows (a)

 Switch to display up/down arrows for this gadget.

minchars=number (minc=)

 Minimum number of character/digits in this gadget.
Defaults to 5.

maxchars=number (maxc=)

 Maximum number of character/digits in this gadget.
Defaults to 10.

minnumber=number (minn=)

 Minimum value for this gadget. Defaults to 0.

maxnumber=number (maxn=)

 Maximum value for this gadget. Defaults to 32768.

defnumber=number (defn=)

 Value for this gadget when window is opened. Defaults to 1.

leftjustify (lj)
centerjustify (cj)

 Set the justification of the text for the gadget. Defaults to rightjustify.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl) childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies
with

'ok GID'

Integer gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

defnumber=number (defn=)

 Set the value for this gadget.



------------------------------------------------------------------------------
                                4.2.2.3 String                                
------------------------------------------------------------------------------

String gadget event
-------------------------

'gadget GID string'

String gadget parameters.
-------------------------

Hook=number

 Select a special string gadget type where number =

PASSWORD        1
IPADDRES        2
FLOAT           3
HEXIDECIMAL     4
TELEPHONE       5
POSTALCODE      6
AMOUNT          7
UPPERCASE       8

NOTE: some types do not seem to implimented in string gadget yet. 1,4,5,8
seem to work under OS 3.9.

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

TabCycle (tc)

 This gadget can be activated using the tab key.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

gadgettext="text" (gt=)

 Set the text in the gadget.

minchars=number (minc=)

 Minimum number of character/digits in this gadget. Defaults to 10.

maxchars=number (maxc=)

 Maximum number of character/digits in this gadget. Defaults to 100.

leftjustify (lj)
centerjustify (cj)

 Set the justification of the text for the gadget. Defaults to rightjustify.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

String gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

gadgettext="text" (gt=)

 Set the text in the gadget.

selected=num  (s=)

 Set the cursor position in a string gadget, and activate the gadget.

bufferpos

 Read the current cursor position in the string gadget. This keyword should 
be used by itself. ( 'id GID getposition')

 It is replied to with 'POSITION ok'.


------------------------------------------------------------------------------
                               4.2.2.4 CheckBox                               
------------------------------------------------------------------------------

CheckBox gadget event
-------------------------

'gadget GID selected_state'


CheckBox gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

selected=number (s=)

  The gadget is selected if number != 0 , unselected if number = 0. Defaults 
to unselected.

gadgettext="text" (gt=)

 Set the text of the gadget.

leftjustify (lj)

 Set the placement of the text for the gadget. Defaults to Rightjustify.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

CheckBox gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

selected=number (s=)

  The gadget is selected if number != 0 , unselected if number = 0.

gadgettext="text" (gt=)

 Set the text of the gadget.


------------------------------------------------------------------------------
                               4.2.2.5 Chooser                                
------------------------------------------------------------------------------

Chooser gadget event
-------------------------

'gadget GID selected'

selected = the selected choice in the chooser.

Chooser gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number !=0. Defaults to 
enabled.

gadgettext="text" (gt=)

 Set the text for the gadget.

selected=number (s=)

  Set which choice is selected when the window opens. Selections start at 0 . 
This defaults to choice 0.

ChooserLabels="choice0|choice1|choice..." (cl)

 Set the choices for the gadget. Maximum 50 choices, do not exceed this !

Maxnumber=count (maxn=)

 The maximum number of selection to display. Defaults to 12.

Popup   (pu)

 This is a popup chooser. Defaults to dropdown.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the
trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

TabCycle (tc)

 This gadget can be selected by cycling with the tab key.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Chooser gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number !=0.

selected=number (s=)

  Set which choice is selected . Selections start at 0 .

chooserlabels="choice0|choice1|choice..." (cl=)

 Change the choices available in the chooser.

defnumber=count (defn=)

 The maximum number of selection to display.


------------------------------------------------------------------------------
                             4.2.2.6 RadioButton                              
------------------------------------------------------------------------------

Radio Button gadget event
-------------------------

'gadget GID selected_state'

Radio Button gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

selected=number (s=)

  Set which choice is selected when the window opens. Selections start at 0 . 
This defaults to choice 0.
to unselected.

RadioLabels="choice0|choice1|choice..."  (rl=)

 Set the choices for the gadget. This parameter MUST be given.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Radio Button gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

selected=number (s=)

 Set the current selection of the radio button.



------------------------------------------------------------------------------
                                 4.2.3 Images                                 
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                4.2.3.1 Label                                 
------------------------------------------------------------------------------

Label gadget parameters.
-------------------------

IDME

Force this object to be assigned a GID. Normaly no GID is assigned to labels. 
The definition reply becomes 'ok GID WIDTH HEIGHT'

The label produces an image and usually puts it into your GUI right away. To 
use the label as a child label of a gadget You MUST use the unattached 
keyword.

unattached (ua)

The unattached keyword does not produce a gadget. It creates an image to be 
used. Up to 50 images can be predefined, the last one defined is the first 
one used. Last In First Out. No GID is assigned EVEN WITH 'IDME'.

font=GID

This sets the font for the label. The GID points to an ALREADY defined text 
attribute.

Selected=num (s=)

 Set the pen number used to render the text.

SoftStyle=num (ss=)

 Set the soft style for the label. This is a bitmaped decimal number.
example 3=bold + underline
            decimal    bit
NORMAL       0          -
UNDERLINED   1          0
BOLD         2          1
ITALIC       4          2
EXTENDED     8          3

gadgettext="Label text"  (gt=)

 Set the text of the Label.

underscore="CHAR"

 Use an alternate character to flag the hotkey for the label. CHAR is a 
single character. This defaults to underscore '_', changing it will allow an 
underscore to be used as a plain character in a label.

leftjustify  (lj)
rightjustify (rj)

 Set the justification of the text for the gadget. Defaults to centerjustify.

minwidth=number  (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number  (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize  (noms)

 Set this gadget to its nominal size.

useimage   (ui)

 Use the last defined image (bitmap/drawlist/penmap) as the gadgets image.

Even

 Correct a possible layout problem in the image position. You will probably 
never use this parameter. Technically it moves th image up one pixel, which 
is useful when mixing different fonts in the same line.

Definition Reply
----------------

 When the image creation is successful the pipe replies with

'ok WIDTH HEIGHT'


------------------------------------------------------------------------------
                                4.2.3.2 Glyph                                 
------------------------------------------------------------------------------

Glyph parameters
-------------------

The glyph keyword does not produce a gadget. It creates an image to be used 
later. Up to 50 images can be predefined, the last one defined is the first 
one used. Last In First Out.

defnumber=number (defnum)

 Choose the image this glyph displays. the possible values number are

0 NONE
1 DOWNARROW
2 UPARROW
3 LEFTARROW
4 RIGHTARROW
5 DROPDOWN
6 POPUP
7 CHECKMARK
8 POPFONT
9 POPFILE
10 POPDRAWER
11 POPSCREENMODE
12 POPTIME
13 RADIOBUTTON
14 RETURNARROW

Definition Reply
-----------------

 When the image creation is successful the pipe replies with

'ok '


------------------------------------------------------------------------------
                               4.2.3.3 DrawList                               
------------------------------------------------------------------------------

DrawList parameters
-------------------

The drawlist keyword does not produce a gadget. It creates an image to be 
used later. Up to 50 images can be predefined, the last one defined is the 
first one used. Last In First Out.

bindata (bd)

The drawlistdata will be passed to this pipe in binary after the command 
line. The drawlistdata parameter now gives the length of the data. Setting 
datain means the data is read from an external file rather than the pipe.

dataout="filename" (do=)

 Send the data for this gadget to a file. This is a development tool to allow 
you to create binary data to pass to the pipe. It is ignored if the Bindata 
keyword is also present.

datain="filename" (di=)

 Read the data for this gadget from a file. It is ignored if the Bindata 
keyword is not present.

minheight=number (minh)

 Set the height of the virtual raster the drawlist data
relates to.

minwidth=number (minw)

 Set the width of the virtual raster the drawlist data relates
to.

drawlistdata="value1|value2|..."   (dld=)

 The draw list data defines a set of drawing instruction to create an image. 
Each drawing instruction has 6 values.
directive|X1|Y1|X2|Y2|pen

The possible directives are

0 END
1 LINE
2 RECT
3 FILL
4 ELLIPSE
5 CIRCLE
6 LINEPAT
7 FILLPAT
8 AMOVE
9 ADRAW
10 AFILL
11 BEVELBOX
12 ARC
13 START = BOUNDS
14 LINESIZE

Register as a Class Act developer and read the docs for more info on 
drawlists.

When sending binary data you send an array of structure DrawLists.

struct DrawList
            {
                WORD dl_Directive;
                WORD dl_X1, dl_Y1;
                WORD dl_X2, dl_Y2;
                WORD dl_Pen;
            };
The last structure MUST be END (dl_Directive=0).

Definition Reply
-----------------

 When the image creation is successful the pipe replies with

'ok'



------------------------------------------------------------------------------
                                4.2.3.4 PenMap                                
------------------------------------------------------------------------------

PenMap parameters
-------------------

The penmap keyword does not produce a gadget.  It creates an image to be used 
later. Up to 50 images can be predefined, the last one defined is the first 
one used. Last In First Out.

bindata (bd)

The PenMapPalette,penmapdata, and selectedimage  will be passed to this pipe 
in binary after the command line, AND IN THAT ORDER. The 
penmapdata,selectedimage, and PenMapPalette parameters now give the length of 
each data segment. Do NOT specify a data length of 0 for selected image, omit 
the keyword instead.

dataout="filename" (do)

 Send the data for this gadget to a file. This is a development tool to allow 
you to create binary data to pass to the pipe. It is ignored if the Bindata 
keyword is also present.

penmapdata="data" (pmd)

The image data. NOTE all values are ascii HEX. The data is in the following 
format.

"width_h_byte|width_l_byte|height_h_byte|height_l_byte|data1|data2..."

If the bindata keyword is used the image data is the following format

word width, height;
char data[];

Note the size specified in penmapdata INCLUDES the 4 bytes for width and 
height.

selectedimage="data" (si)

The image data for a selected image. NOTE all values are ascii HEX. The data 
is in the following format.

"width_h_byte|width_l_byte|height_h_byte|height_l_byte|data1|data2..."

If the bindata keyword is used the image data is the same format as
for penmapdata.

PenMapPalette="data" (pmp)

The palate data. NOTE all values are ascii HEX. The data is in the following 
format.

"triplet_count|red1|green1|blue1|red2|..."

If the bindata keyword is used the palate data is the format

           ULONG palette[] =
           {
               number_triplets,
               red1, green1, blue1,
               red2, green2, blue2,
               ...
           };



Trans

 Make pen 0 transparent.


------------------------------------------------------------------------------
                                4.2.3.5 Bitmap                                
------------------------------------------------------------------------------

BitMap parameters
-------------------

The bitmap keyword does not produce a gadget. It creates an image to be used 
later. Up to 50 images can be predefined, the last one defined is the first 
one used. Last In First Out.

FileName='path:file' (fn)

 The file to read and produce an image from using datatypes.

selectedimage='path:file' (si)

 The file to read and produce the selected image from using datatypes.

trans

Make the image background transparent
(if the associated image and datatype allows this).

Part="x|y|wide|high|offsetx|offsety|buffer"

x,y              the left and top pixel of the first image.
wide,high        the size of the images.
offsetx,offsety  the offset to the selected state image.
buffer           the buffer used to store the root bitmap. (0-9)
                 ( buffer 0 is also used for button animations )

 Use portions of a bitmap for this image.

The image is only part of the root bitmap specified by x|y|wide|high, the 
offsets can be set to 0 to make the normal and selected state the same.

filename="" will cause this image to use the next available predefined bitmap
for the root bitmap. (only with 'part')

Not including a file name at all will reuse an existing root bitmap. This 
allows you to only load one bitmap with a images needed. You can then reuse 
parts mutiple times. Also you only need to have a single image file for most 
applications rather than several small ones.(only with part)

 It is possible to redefine an image buffer. When this is done the previous 
contents of the image buffer are saved before the new bitmap is created. See 
the freeimage modify command for more information on handling image buffers.

Definition Reply
-----------------

 When the image creation is successful the pipe replies with

'ok BITMAP_width BITMAP_height'


------------------------------------------------------------------------------
                                4.2.3.6 Image                                 
------------------------------------------------------------------------------

Image gadget parameters.
-------------------------

You must first define an image before you can produce an image gadget. The 
last defined image is placed into the GUI.

IDME

Force this object to be assigned a GID. Normaly no GID is assigned to Images. 
The definition reply becomes 'ok GID'

minwidth=number  (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number  (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize  (noms)

 Set this gadget to its nominal size.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok'

------------------------------------------------------------------------------
                                4.2.3.7 Space                                 
------------------------------------------------------------------------------


Space gadget parameters.
-------------------------

IDME

Force this object to be assigned a GID. Normaly no GID is assigned to spaces. 
The definition reply becomes 'ok GID'

trans

 Turn transparency on for this space.

minwidth=number  (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

bevel=TYPE  (b=)

 Set the bevel type for this gadget. Defaults to none.
0=NONE
1=THIN
2=BUTTON
3=GROUP
4=FIELD
5=DROPBOX
6=SBAR_HORIZ
7=SBAR_VERT
8=BOX
9=STANDARD


Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok'

------------------------------------------------------------------------------
                                4.2.4 Special                                 
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                             4.2.4.1 Layout(End)                              
------------------------------------------------------------------------------

LayOutEnd parameters
----------------------

LayOutEnd=le=pg

(pg is for historical reasons)

This ends the current layout group. It takes no parameters.

layout parameters.
-------------------------

Layouts can be nested up to 50 deep.

page=GID

 Use this layout group as a page in the Clicktab gadget specified by GID.

selected=number (s=)

 The clicktab page to be displayed on startup, defaults to 0. Ignored unless 
page is also specified. It is only useful when adding the final page to a 
clicktab.

font=GID

This sets the font for the whole group. The GID points to an ALREADY defined 
text attribute.


bevel=TYPE  (b=)

 Set the bevel type for this gadget.
0=NONE
1=THIN
2=BUTTON
3=GROUP
4=FIELD
5=DROPBOX
6=SBAR_HORIZ
7=SBAR_VERT
8=BOX
9=STANDARD


gadgettext="group label" (gt=)

 set the group label for this group. Ignored if nobevel is
set.

labr
labl
labc

 Set the position of the layout label (topleft/topright/topcenter). Defaults 
to the users prefs setting, so don't set/force this unless you really need 
to..

defn=PEN

The pen number to use when backfilling this layout.

fpat="HEX"

 The fill pattern to backfill this layout. A 24 bit hexidecimal number, 
interpeted as a 16 x 2 pattern. fpat is ignored unless defn is also 
specified.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

SpaceOuter (so)

 Leave a blank space outside the layout group.

SpaceInner  (si)

 Leave a blank space around elements in the layout group.

disable=number (dis=)

 The gadgets in this layout are enabled if number = 0 , disabled if number != 
0. Defaults to enabled.

centerjustify  (cj)
rightjustify   (rj)
bottomjustify  (bj)

 Set the justification of the gadgets in this layout. Defaults to leftjustify 
or topjustify.

vertical      (v)

 Switch to display gadgets vertically, defaults to horizontal.

even      (e)

 Switch to make gadgets/groups all the same size.

shrinkwrap  (sw)

 Switch to cause gadgets in this group to have no space between them.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

 LayoutEnd replies with

'ok'

layout modify parameters.
-------------------------

disable=number (dis=)

 The gadgets in this layout are enabled if number = 0 , disabled if number != 
0. Defaults to enabled.

refresh (ref)


------------------------------------------------------------------------------
                               4.2.4.2 ClickTab                               
------------------------------------------------------------------------------

ClickTab gadget event
-------------------------

'gadget GID selected_page'

ClickTab gadget parameters.
-------------------------

This actually creates a pair of connected gadgets, a clicktab->pagegadget. 
Each tab labels will display a different page in the page gadget. See parent 
group for how
to attach a page to a clicktab gadget.

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

ClickTabLabels="choice0|choice1|choice..." (ctl)

 Set the choices for the gadget. This parameter MUST be given.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

ClickTab gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

NOTE: when you disable a layout, Clicktab gadgets in the layout do not
properly disable themselves (CA/Reaction bug?). You must manualy disable the
clicktabs your self.

target=number  (tar=)

 When used with disable only the targeted tab is enabled or disabled. If
target is not specified all tabs will be disabled or enabled.

selected=number  (s=)

 Set the page displayed by the clicktab gadget.

refresh (ref)

 Redraw the gadget.

------------------------------------------------------------------------------
                               4.2.4.3 TextAttr                               
------------------------------------------------------------------------------

TextAttr parameters.
-------------------------

gadgettext="fontname"  (gt=)

This text defines the font.  Remember the '.font' like 'gt=topaz.font'

defnumber=number  (defn=)

The font size attribute.

selected="number"  s=

The fonts style attributes. Sorry it a decimal number...

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID HEXADDRESS'

The address allows you to use the text attribute with the 'set' modify 
command.

 The same text attribute can be used to specify a font for many gadgets.

------------------------------------------------------------------------------
                             4.2.4.4 BrowserNode                              
------------------------------------------------------------------------------

BrowserNode gadget parameters.
-------------------------

 Browsernodes always belong to last defined listbrowser. NEVER use the 
BrowserNode keyword after you GUI window has opened. Use the AddNode modify 
command instead.

selected=number (s=)

  The node is selected if number != 0 , unselected if number = 0. Defaults to 
unselected.


  Set which choice is selected when the window opens. This is only for 
multiple select list browsers. Set selected in the Listbrowser definition for 
single select lists.

GadgetText="[^|¶]text0|[^|¶]text1|[^|¶]text..." (gt=)

 Set the text(s). This parameter MUST be given. YOU MUST NOT GIVE MORE TEXTS 
THAN THE AMOUNT OF COLUMNS IN THE LISTBROWSER. A leading '^' makes the text 
editable. A leading '¶' (ALT p) uses the last defined image for the column 
rather than text. Note that images used in browsernodes can not be more than 
255 pixels high. (hint: split larger images and use more than one node)

NOTE: the following parameters may only be used if the ListBrowser containing 
the node allows parenting.

defnumber=number  (defn=)

 Set the Generation of this browser node.

browsernodeparent  (bnp)

 This browser node has children.

Definition Reply
-----------------

 When the node creation is successful the pipe replies with

'ok GID'

BrowserNode gadget modify parameters.
-------------------------------------

GadgetText="[^|¶]text0|[^|¶]text1|[^|¶]text..." (gt=)

 Set the text(s). YOU MUST NOT GIVE MORE TEXTS THAN THE AMOUNT OF COLUMNS IN 
THE LISTBROWSER. A leading '^' makes the text editable. A leading '¶' (ALT p) 
uses the last defined image for the column rather than text. Note that images 
used in browsernodes can not be more than 255 pixels high. (hint: split 
larger images and use more than one node)

removenode (remn)

 remove this browsernode from its ListBrowser

selected=number (s=)

  The node is selected if number != 0 , unselected if number = 0. This is 
only for nodes in multi select listbrowsers, for single select browsers see 
the listbrowser modify docs.

read
sort=COLUMN#

 To read a browser node you must also specify a column. The text contents of
that column are returned.

refresh (ref)

 Refresh this listnodes listbrowser (not just the node itself). When setting 
multiple nodes in a multiselect listbrowser only refresh when you set the 
last node. This avoids multiple refreshes.

hidechild=num (hc=)

 If num =0 show all this nodes children . If num >0 then hide all this nodes 
children.

------------------------------------------------------------------------------
                                 4.2.4.5 Menu                                 
------------------------------------------------------------------------------

Menu gadget event
-------------------------

'menu menu_number item_number sub_item_number checked'

checked=0 Item is not checked
checked=1 Item is checked

Menu gadget parameters.
-------------------------

gadgettext="menudata"  (gt=)

This text defines a menu for the CA window. The data is the following format.

menu_title|menu_item0|menu_item1 ...

Each menu_item is the following format

[@hotkey][$][-][^][%][&][!][`][#HEX_number#]menu_item_title

@ = hotkey for menu, following character is hotkey.
$ =  sub Item (of previous menu_item)
- =  Display a separator bar (ignore text and other options for this item )
^ =  menu toggle
% =  menu checkable (unchecked at startup)
& =  menu checkable (checked at startup)
! =  highlight none
` =  disabled
# =  mutual exclude. Note the trailing '#' MUST be used.
If multiple flags are set they MUST be in the order shown.

Note: '`' is the only flag that may be set for the menu title.
Note: Separator bars are considered a menu item. Example

gt="dothis|-|dothat"
dothis is item 0, the bar is item 1, dothat is item 2.

replace=GID

 Use this menu to replace an existing menu specified by GID.

Menu gadget modify parameters.
-------------------------

disable=number (dis=)

 The menu or menu item is enabled if number = 0 , disabled if number != 0.

selected=number (s=)

  The menu item is checked if number != 0 , unchecked if number = 0. Ignored 
if a target is not specified.

target=number  (tar=)

 If a target is specified you are modifying a menu item. If a target is not 
specified you are modifying the menu itself.

------------------------------------------------------------------------------
                                4.2.4.6 Arexx                                 
------------------------------------------------------------------------------

Arexx event  stream
-------------------

Arexx events are handled differently than other types of events, be careful.

The events are as follows.


'arexx FID textlength <newline> text'

    FID is the function ID number

    textlength is the length of the text after the newline character.


If modify is turned on, after each event you MUST write a single line to the 
pipe in the following format.

'rc=number result="(result text|length)" [bd]'

If rc > 0 result is ignored, if RC is omitted it defaults to 0.

If the bd (binary data) keyword is given result MUST be the length of the 
data to be returned, and you then MUST write length chars of data to the 
pipe.

The pipe replies with 'ok' to your result line (unless quiet is set).

If modify is not turned on all arexx events are given a rc of 0 (success) and 
a null result.

Arexx object parameters.
-------------------------

gadgettext="HOSTNAME|Function0|Function1|..."  (gt=)

The gadget text defines the arexx host name and the functions available. 
Hostname should be all capitals, function names should not contain spaces. 
The first function is FID 0, the second FID 1, ...

slot

This switch causes a slot number to appended to the host name. TESTHOST would 
become TESTHOST.1 or TESTHOST.2 etc.

Arexx definition Reply
----------------------

 When the ARexx object creation is successful the pipe replies with

'ok HOSTNAME'

NOTE only one arexx host can be defined for each GUI window.

Additional info
---------------------

To have a arexx host with no GUI window, set the NoWindow switch in the 
window definition.  See the window docs for more information.

------------------------------------------------------------------------------
                                 4.2.5 Fancy                                  
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                               4.2.5.1 GetFile                                
------------------------------------------------------------------------------

There are actually two file requesters available in AWNPipe. The 
ClassAct/Reaction getfile.gadget, and the ASL file requester. Only the 
getfile.gadget can be displayed in a gui. Both can be opened under your 
control to present the user with a file requester. The details for the ASL 
requester are at the end of this file.

  *** GETFILE GADGET CLASS ***

GetFile gadget event.
-------------------------

'gadget GID  success ["filename" ["filename" ...]]'

 Success=0 user selected no file or canceled.
 Success!=0 user selected a file.
Filenames are fully qualified with path.

GetFile gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.


readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

gadgettext="file requester title" (gt=)

 Set the title of the file requester.

pattern="pattern" (pat=)

 Set and Enable pattern matching in the file.

multi  (m)

 Allow multi selection in the file requester. (does not seem to work)

save

 This is a save requester.

drawers (dr)

 Only show and allow selections of drawers.

icons (i)

 Do NOT show .info files.

filename="path:filename" (fn=)

 Set the filename and directory for the file requester. It must end in a '/' 
for drawer only file requesters

Wide=num
High=num

 Set the size of the requester when opened.

unattached    (ua)

 This file requester is not attached to the CA window. It may still be 
activated in the modify conversation.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies
with

'ok GID'

GetFile gadget modify parameters.
-------------------------

selected=number (sel=)

This modify command is only valid for UNATTACHED getfile gadgets. Number is 
ignored but must be given. This opens the file requester and the selected 
files are returned rather than a simple ok.
You should not use other modify instructions on the same line as 'selected'.

NOTE: You can not force an attached getfile to open.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

save=number

 If number=0 this is NOT a save requester. If number~=0 this is a save 
requester.

filename="path:filename" (fn=)

 Set the filename and directory for the file requester.

gadgettext="title" (gt=)

 Set the file requesters title.


  *** GETFILE ASL ***

The ASL requester does not send events.

GetFile ASL parameters.
-------------------------

ASL

  This tells AWNP you want to define an ASL file requester.

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.


gadgettext="file requester title" (gt=)

 Set the title of the file requester.

pattern="pattern" (pat=)

 Set and Enable pattern matching in the file.

multi  (m)

 Allow multi selection in the file requester. (does not seem to work)

save

 This is a save requester.

drawers (dr)

 Only show and allow selections of drawers.

icons (i)

 Do NOT show .info files.

filename="path:filename" (fn=)

 Set the filename and directory for the file requester. It must end in a '/' 
for drawer only file requesters

Wide=num
High=num

 Set the size of the requester when opened.

top=num
left=num

 Set the position of the requester when it opens.

postx="positive text"

 Set the text for the positive choice in the file requester. Defaults to OK.

negtx="negative text"

 Set the text for the positive choice in the file requester. Defaults to 
Cancel

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies
with

'ok GID'

GetFile ASL modify parameters.
-------------------------

 You can only modify the ASL getfile requester when opening it. Unless the 
selected keyword is present the modify line is ignored.


selected=number (sel=)

Number is ignored but must be given. This opens the file requester and you 
get returned the following line rather than a simple ok.

SUCCESS "path:drawer/filename" "path2:drawer2/filename2"  ...

SUCCESS=0 if the user aborted the file requester without making a selection. 
SUCCESS !=0 if the user selected a file, each file name is quoted and all are 
on a single line.

save=number

 If number=0 this is NOT a save requester. If number~=0 this is a save 
requester.

filename="path:filename" (fn=)

 Set the filename and directory for the file requester.

gadgettext="title" (gt=)

 Set the file requesters title.

Wide=num
High=num

 Set the size of the requester when opened.

top=num
left=num

 Set the position of the requester when it opens.

postx="positive text"

 Set the text for the positive choice in the file requester. Defaults to OK.

negtx="negative text"

 Set the text for the positive choice in the file requester. Defaults to 
Cancel


------------------------------------------------------------------------------
                               4.2.5.2 GetFont                                
------------------------------------------------------------------------------

GetFont gadget event.
-------------------------

'gadget GID  success fontname fontsize fontstyle fontflags'

 Success=0 user selected no font or canceled. Success!=0 user selected a 
font.

GetFont gadget parameters.
-------------------------

font=GID

This sets the font for the gadgets text. The GID points to an ALREADY defined 
text attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

gadgettext="font requester title" (gt=)

 Set the title of the file requester.

style

 This requester includes style settings.

fixed

 This requester includes fixed width fonts only.

Minn=num
Maxn=num

The minimum and maximum font size allowed. Defaults to 6-20

Wide=num
High=num

 Set the size of the requester when opened.

unattached    (ua)

 This file requester is not attached to the CA window. It may still be 
activated in the modify conversation.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl) childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies
with

'ok GID'

GetFont gadget modify parameters.
-------------------------

selected=number (sel=)

Number is ignored but must be given. This opens the font requester and the 
selected font is returned rather than a simple ok.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

------------------------------------------------------------------------------
                              4.2.5.3 TextEditor                              
------------------------------------------------------------------------------

The TextEditor.gadget is only available under ADOS 3.5 . At this time only
beta versions were available but the TextEditor gadget is so great it had to
be included in AWNPipe. These functions should all work once it is released.


 TextEditor gadget event.
-------------------------
An event is only generated when the user double clicks the gadget.

'gadget GID DoubleClickPositionX DoubleClickPositionY'

DoubleClickPositionX/Y is the position in the current line the user double 
clicked.

NOTE: You must the TextEditor directly at appropriate times in your program. 
This means you should have modify turned on if the TextEditor gadget is not 
read only.


TextEditor gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

arrows (a)

 Give the TextEditor a scroll gadget on the right.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

export="num"

 Set the export hook for the TextEditor.

num=0  Plain text hook
num=1  EMail hook

import="num"

 Set the import hook for the TextEditor.

num=0  Plain text hook
num=1  EMail hook
num=2  Mime hook
num=3  Mime quoted hook

block

 The texteditor should mark a block of text as well as generate an event when 
it is double clicked.

gadgettext="text" (gt=)

 Set the text in the gadget.
given.

bindata (bd)

The text will be passed to this pipe in binary after the command line. The 
gadgettext parameter now gives the length of the data. Setting datain means 
the data is read from an external file rather than the pipe.

datain="filename" (di=)

 Read the data for this gadget from a file.
It is ignored if the Bindata keyword is not present. A length of 0 means to 
use the complete file.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Fixed

 Use a fixed font for this TextEditor.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

TextEditor gadget modify parameters.
-------------------------
read

 This should not be used with any other parameters. It is ALWAYS responded to 
with 'SIZE<newline>CHARACTERS'.

SIZE is the number or characters after the newline. The characters are the 
current contents of the TextEditor gadget.

info

 This should not be used with any other parameters. It is ALWAYS responded to 
with
'CURSORX CURSORY BLOCKMARKED [BSTARTX BSTARTY BENDX BENDY]'.

CURSORX and CURSORY are the current cursor location, BLOCKMARKED=0 if no 
block is marked, BLOCKMARKED~=0 means a block is currently marked. BSTARTX/Y 
and BENDX/Y (the start and end of the marked block) are only given if 
BLOCKMARKED!=0.

update=number

If number=0 then turn off updating of the Texteditor gadget. If number!=0 
then turn updating of the gadget back on.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

readonly=num (ro=)

 if num != 0 then this gadget is read only. If num =0 then the gadget is NOT
readonly.

clear

 Remove all text from the TextEditor gadget.

CursorY="num" (cy=)

 Set the cursor to Y position to num.

Cursorx="num" (cx=)

 Set the cursor to Y position to num.

command="string" (cmd=)

 Have the TextEditor gadget execute the Arexx command given in string.Command 
should not be used with other modify parameters.

 Command always replies with 'ok SUCCESS [SIZE] <newline>[CHARACTERS]'
 if SUCCESS!=0 then the command was handled by the TextEditor, if SUCCESS=0 
then the command was not recognised.
 If the command succeeds you MUST check to see if SIZE is given. If size is 
specified you then read SIZE  the number or characters after the newline. 
This is data returned by the command to the TextEditor.

replace

 Replace the text highlighted with the text given in gadgettext.

Replace ALWAYS responds with 'RESULT' where result=0 if a marked string is 
not found, and RESULT !=0 if the replace is successful.

search

 Search for the text given in gadgettext.

Search ALWAYS responds with 'RESULT' where result=0 if the search string is 
not found, and RESULT !=0 if the search string is found.

gadgettext="text" (gt=)

 Insert the text in the gadget. OR text to search for if search parameter is 
specified, OR text to replace highlighted text with if replace is specified.

target="num" (tar=)

 If num=0 insert text at start of current contents. If num!=0 then insert 
text at the cursor position. If target is not specified the text is inserted 
at the end of the current contents.
If target is not given insert text at cursor position (default).

  OR

With search, num is a bit field for search modifiers.

bit 0 (1)  search from top
bit 1 (2)  search next (default)
bit 2 (4)  search case sensitive
bit 3 (8)  search dospattern
bit 4 (16)  search backwards

Unfortunately this is implemented as a decimal number. See the 'Hints' 
section for easy ways to handle this.

bindata (bd)

The text will be passed to this pipe in binary after the command line. The 
gadgettext parameter now gives the length of the data. Note that you can NOT 
use datain during modify.

Search responds with 'ok RESULT' where result=0 if the search string is not 
found, and RESULT !=0 if the search string is found.

------------------------------------------------------------------------------
                              4.2.5.4 TextFeild                               
------------------------------------------------------------------------------

TextField gadget event.
-------------------------
NOTE: The textfield gadget has two event forms. For more information see the 
shortevent parameter below

Short Event
'gadget GID'

or Default event.
'gadget GID size <newline> characters[size]'

The next 'size' number of characters after the newline are the contents of 
the TextField gadget.

Textfield gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

arrows (a)

 Give the textfield a scroll gadget on the right.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

TabCycle (tc)

 This gadget can be activated using the tab key.

gadgettext="text" (gt=)

 Set the text in the gadget.

bindata (bd)

The text will be passed to this pipe in binary after the command line. The 
gadgettext parameter now gives the length of the data. Setting datain means 
the data is read from an external file rather than the pipe.

datain="filename" (di=)

 Read the data for this gadget from a file.
It is ignored if the Bindata keyword is not present. A length of 0 means to 
use the complete file.

shortevent  (se)

 The events sent by the textfield gadget do not include the contents of the 
textfield. This parameter only works if modify is turned on.Also see events 
above.


centerjustify  (cj)
rightjustify   (rj)

 Set the justification of the text for the gadget. Defaults to leftjustify.

bevel=TYPE  (b=)

 Set the bevel type for this gadget.

0=NONE
1=THIN
2=BUTTON
3=GROUP
4=FIELD
5=DROPBOX
6=SBAR_HORIZ
7=SBAR_VERT
8=BOX
9=STANDARD


minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Textfield gadget modify parameters.
-------------------------
disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

gadgettext="text" (gt=)

 Set the text in the gadget to text if scroll keyword is not used. Else 
insert the text at the position set by scroll.

scroll="num"

 Set the cursor to position num.

delete=num

 Delete num of characters from the cursor forward.

bindata (bd)

The text will be passed to this pipe in binary after the command line. The 
gadgettext parameter now gives the length of the data. Note that you can NOT 
use datain during modify.

All modifications of a textfield (except a lone disable) are responded to by 
'ok POSITION' where POSITION is the final curser position.

------------------------------------------------------------------------------
                             4.2.5.5 ListBrowser                              
------------------------------------------------------------------------------

ListBrowser gadget event
-------------------------

'gadget GID event_source event_column NodeGID [NodeGID [NodeGID ...]]'

event_source&1 means normal selection of node.

event_source&2 means this nodes children have been hidden.

event_source&4 means this nodes children are now shown.

event_source&8 means node has been edited.

event_source&16 means double click on node.

event_column is the column the mouse was over when the node was clicked.

ListBrowser gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

readonly (ro)

 This list browser entries can not be edited.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

selected=number (s=)

  Set which choice is selected when the window opens. Selections start at 0 . 
This defaults to none. CAREFUL modify uses the listnode GID, this parameter 
uses the ordinal position of the node.

ListbrowserLabels="text0|text1|text..."  (lbl=)

 Set the column labels for the list. Defaults to 1 unlabeled column.  NO MORE 
THAN 20 COLUMNS can be defined !

bnparent (bnp)

 Allow parenting in this listbrowser.

showtitles (st)

 Show the column tiles of this listbrowser.

vertical (v)

 Use vertical separators in the listbrowser.

hori (h)

 Use horizontal separators in the listbrowser.

arrows   (a)

 Show arrows for horizontal scrolling and make this a virtual width list.

multi  (m)

 Switch to allow multi selection in the list. Multi select by holding the 
shift key.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

SPECIAL FUNCTION
-----------------
/* do not use this function it may be removed !*/
/* instead see the note at the end of this doc */
 Using sort on a line BY ITSELF during gadget definitions will cause the last 
defined listbrowser to be sorted. This is to allow a list browser to be 
sorted before the gui window is opened. (the modify sort command sorts the 
listbrowser after the window is opened.)

sort=COLUMN#

(optional) sort=COLUMN# defn=COLUMN#

 Sort list browser based on the column number, if the sort entries are the 
save a secondary sort based on the defaultnumber column is done. Specifying a 
secondary column to sort by is optional. Remember columns start at 0. You 
MUST NOT specify an invalid column number.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

ListBrowser gadget modify parameters.
-------------------------
down

Select the next node in the list.

up

Select the previous node in the list.

addnode (addn)

 Add a new node to this ListBrowser.

 You should keep this modify command a s simple as possible, only use 
keywords that specifically deal with the creation of the node. (tar gt bnp 
defn sc )

 Put additional changes like select= or disable = in a separate modify line. 
Some keywords like refresh, tick, disable, sort, and others could cause extra 
'oks' to be in the response line.

 Keep it simple and this modify command is responded to with 'ok GID' where 
GID is the ID of the browser node.

GadgetText="[^|¶]text0|[^|¶]text1|[^|¶]text..." (gt=)

 Set the text(s) for the added node. This parameter MUST be given if you are 
using 'addnode' . YOU MUST NOT GIVE MORE TEXTS THAN THE AMOUNT OF COLUMNS IN 
THE LISTBROWSER. A leading '^' makes the text editable. A leading '¶' (ALT p) 
uses the last defined image for the column rather than text. Note that images 
used in browsernodes can not be more than 255 pixels high. (hint: split 
larger images and use more than one node)

defnumber=number  (defn=)

 Set the Generation of this browser node.

target=GID  (tar=)

 If GID=0 add the new node at head of list. If GID=-1 add the new node at 
tail of list. Else add the new node immediately after the node specified by 
GID.

browsernodeparent  (bnp)

 The new browser node has children.

List=number

 If number=0 detach the node list from the listbrowser. If number!=0 then 
reattaches the node list to the listbrowser.

removenode (remn)

 Remove ALL browsernodes from this ListBrowser.

readonly (ro)

 This list browser entries can not be edited.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

scroll=GID (scr=)

 Scroll the listbrowser so the node specified by GID is at the top.

selected=num (s=)

  For multi select lists

 Setting selected=0 sets all nodes as unselected. Setting selected=-1 sets 
all nodes as selected.  You may set the nodes individually instead of using 
this command. See browsernode modify commands.

selected=node_GID (s=)

  For single select lists

 Set the selected node. Selected=0 sets all nodes as unselected, else the 
specified node is selected. CAREFUL modify uses the listnode GID not the 
ordinal position. This is different then in the listbrowser definition.

order

 Read the order of nodes in the listbrowser. This does not return the normal 
'ok' instead it returns a sequence of GID's in the same order as the nodes in 
the listbrowser. THIS COMMAND SHOULD NOT BE USED WITH ANY OTHER MODIFY 
COMMANDS ON THE SAME LINE.

sort=COLUMN#

(optional) sort=COLUMN# defn=COLUMN#

 Sort list browser based on the column number, if the sort entries are the 
save a secondary sort based on the defaultnumber column is done. Specifying a 
secondary column to sort by is optional. Remember columns start at 0. You 
MUST NOT specify an invalid column number.

autofit

 This keyword forces the listbrowser to evaluate its size. It is only needed 
when a listbrowser uses a font other than the screen default font AND no new 
browser nodes are added after the GUI window is opened.

hidechild=num (hc=)

 If num =0 show all the children in this listbrowser. If num !=0 then hide 
all the children in this listbrowser.

NOTE: At times you may want to modify a listbrowser after is is created, but 
BEFORE the window is opened. Use the 'NoWindow' keyword in the window 
definition, create the GUI as usual. When you send 'open' the window does NOT 
open but you do go into modify mode. Modify the GUI then send 'id 0 s 64' to 
open the window after it has been modified.

------------------------------------------------------------------------------
                               4.2.5.6 Palette                                
------------------------------------------------------------------------------

palette gadget event
-------------------------

'gadget GID selected_color'

Palette gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

minnumber=number (minn=)

 The first color to display in this gadget. Defaults to 0.

maxnumber=number (maxn=)

 How many colors to display in this gadget. Defaults to 8.

selected=number (s=)

 Color selected when window is opened. Defaults to 0.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Palette gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

selected=number (s=)

 Set the color selected in the gadget


------------------------------------------------------------------------------
                                  4.2.6 More                                  
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                              4.2.6.1 Fuelgauge                               
------------------------------------------------------------------------------


The Fuel gauge do not produce events.


FuelGauge gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

close (c)

 This gadget will close the window when selected by the user.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number !=0. Defaults to 
enabled.

gadgettext="text" (gt=)

 Set the text of the gadget.

centerjustify (cj)

 Set the justification of the text for the gadget. Defaults to leftjustify.

vertical   (v)

 This fuelgauge is vertical. Defaults to horizontal.

ticks=number (t=)

 Set the  'number' of ticks in the fuel gauge. Defaults to 11.

percent (per)

 Show the percentage full as the fuel gauge text.

minnumber=number (minn=)

 Empty value for this gadget. Defaults to 0.

maxnumber=number (maxn=)

 Full value for this gadget. Defaults to 100.

defnumber=number  (defn=)

 Value for this gadget when window is opened. Defaults to 50.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

childlabel    (chl)
childlabelr   (chlr)

 Use the previously defined image as a childlabel for this gadget. Display 
the childlabel to the right or left of the gadget.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

FuelGauge gadget modify parameters.
----------------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

gadgettext="text" (gt=)

 Set the text of the gadget.

defnumber=number  (defn=)

 Value for this gadget .

get=TAG

 Read the value of a specific gadget attribute. Returns a blank line if 
attribute is not readable. This should not be combined with any other modify 
command on the same line.

refresh (ref)

 Redraw the gadget.

------------------------------------------------------------------------------
                               4.2.6.2 Scroller                               
------------------------------------------------------------------------------

Scroller gadget event.
-------------------------

'gadget GID scroller_value'

Scroller gadget parameters.
-------------------------

font=GID

This sets the font for the gadget. The GID points to an ALREADY defined text 
attribute.

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

vertical   (v)

 This gadget is free vertically, defaults to free horizontally.

arrows (a)

 Switch to display arrows for this gadget.

delta=number

 The change in the gadget when an arrow is clicked. Defaults to 1.

knob=number

 The size of the knob in the scroller.

maxnumber=number (maxn=)

 Maximum value for this gadget. Defaults to 100.

defnumber=number  (defn=)

 Value for this gadget when window is opened. Defaults to 0.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

Scroller gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

defnumber=number  (defn=)

 Value for this gadget.

knob=number

 The size of the knob in the scroller.

maxnumber=number (maxn=)

 Maximum value for this gadget. Defaults to 100.


------------------------------------------------------------------------------
                                4.2.6.3 Slider                                
------------------------------------------------------------------------------

Slider gadget event.
-------------------------

'gadget GID slider_value'

slider gadget parameters.
-------------------------

readonly (ro)

 This gadget is read only.

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0. Defaults to 
enabled.

ticks=number

 Set how many ticks to display along the slider.

Sticks

 Show every second tick as a short tick.

Flip

 Reverse the min and max positions on the slider.

vertical   (v)

 This gadget is free vertically, defaults to free horizontally.

maxnumber=number (maxn=)

 Maximum value for this gadget. Defaults to 100.

minnumber=number (minn=)

 Maximum value for this gadget. Defaults to 100.

selected=number  (s=)

 Value for this gadget when window is opened. Defaults to 0.

useimage (ui)

 Use the last defined image as the knob for this slider.

bodyimage (bi)

 Use the last defined image as the body of this slider.

 NOTE: if both useimage and bodyimage are given, the knob gets the last 
defined image , the body gets the send last defined image.

minwidth=number (minw=)

 Set the minimum width for this gadget

minheight=number (minh=)

 Set the minimum height for this gadget

weightedwidth=number (weiw=)

 Set the weighted width for this gadget

weightedheight=number (weih=)

 Set the weighted height for this gadget

nominalsize (noms)

 Set this gadget to its nominal size.

replace=GID

 Use this gadget to replace an existing gadget specified by GID.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok GID'

slider gadget modify parameters.
-------------------------

disable=number (dis=)

 The gadget is enabled if number = 0 , disabled if number != 0.

selected=number  (s=)

 Value for this gadget.


------------------------------------------------------------------------------
                              4.2.6.4 WeightBar                               
------------------------------------------------------------------------------

WeightBar parameters
----------------------

WeightBar

Place a user controllable weightbar in the GUI. WeightBar has no parameters.

Definition Reply
-----------------

 When the gadget creation is successful the pipe replies with

'ok'

------------------------------------------------------------------------------
                              4.2.6.5 Commodity                               
------------------------------------------------------------------------------

Commodity event
----------------

Commodity    "cx TYPE [SUBTYPE]"

 TYPE=hotkey            The commodities hotkey has been detected.
 TYPE=kill              The commodity has been requested to quit.
 TYPE=unique            Another commodity with the same name tried to start 
(but always fails)
 TYPE=show              The commodity has been requested to show its GUI.
 TYPE=hide              The commodity has been requested to hide its GUI.
 TYPE=disable           The commodity has been disabled.
 TYPE=enable            The commodity has been enabled.


 With dis/enable your commodity is automatically enabled or disabled. You 
MUST respect this in your program. With other commodity events you SHOULD TRY 
to react in some proper way.

 The next three types are included to alow for future enhancements of the 
Amiga Commodity ability.

 TYPE=command SUBTYPE   The commodity has received an unrecognized command. 
The subtype is the messageID.
 TYPE=event SUBTYPE     The commodity has received an unrecognized event. The 
subtype is the messageID.
 TYPE= NUMBER SUBTYPE   The commodity has received an unrecognized message 
type. Number is the message type, subtype is the messageID.

Commodity parameters
--------------------

You may only create one commodity object, per GUI.

CxName="name"

Name Commodities uses to identify this commodity.(REQUIRED)

CxPri=number

The priority of your commodity, defaults to 0.

CxTitle="title"

Title of commodity that appears in CXExchange.

CxDesc="description"

Description of the commodity.

CxHotkey=" hotkey description"

example  CxHotKey="ctrl alt f1"

CxNoGui

Do not allow CXExchange to request GUI open and closing.

Definition Reply
-----------------

 When the commodity creation is successful the pipe replies with

'ok'

Modify parameters
-----------------

Normally you should not need to disable or enable your commodity as it is 
handled automatically. This gives you the ability to override the automatic 
control, use it carefully.

Commodity=number

If number =0 then disable the commodity, else enable the commodity. Replied 
to with ok.

------------------------------------------------------------------------------
                                4.2.6.6 Sound                                 
------------------------------------------------------------------------------

Sound objects do not generate events
-------------------------

Sound object parameters.
-------------------------

FileName="path:file"

Specify the file file containing the audio data. This parameter MUST be 
given. Datatypes are used to generate the sound object.

Volume=NUM

The volume to play the sound at 0-64. Defaults to 64.

Period=NUM

The period for playback of the sound. Defaults to natural period for the 
sample.

Cycles=NUM

The amount of cycles of the sound to play. Defaults to 1.

Definition Reply
-----------------

 When the object creation is successful the pipe replies with

'ok GID'

Sound object modify parameters.
-------------------------

Period=NUM

The period for playback of the sound.

Volume=NUM

The volume to play the sound at 0-64. Defaults to 64.

NOTE: To work around a pre-ADOS 3.5 sound.dataype bug you can change the 
volume or frequency at the same time playback is triggered.

topipe('ID soundGID Volume new_volume Period new_period S 2')

Under OS3.5 volume and frequency can  be changed any time, but period may not 
work as expected.

Selected=TriggerMethod   (s=)

Cause the sound object to react. Most sound objects only support the trigger 
method Play (2) and method Stop (14).

Some other trigger methods for future compatability.

PAUSE		1
PLAY		2
REWIND		12
FASTFORWARD	13
STOP		14
RESUME		15

Select is replied to with 'ok RESULT' where result =1 when the trigger method 
was supported and result=0 when it is not supported.

NOTE: Trigger method 14 (stop) appears to be broken under ADOS 3.x and can 
hang the system. It should not use it at present.

FreeSound

FreeSound will dispose of the sound object. Under ADOS 3.1 the command may 
wait until the sound finishes playing. Under ADOS 3.5 the sound is stopped 
immedaitly and the object freed.

Sound objects are disposed of automaticaly when the GUI host is closed. Uses 
this function when it is better to free the sound object sooner.




------------------------------------------------------------------------------
                                  4.3 Events                                  
------------------------------------------------------------------------------

EVENT TYPES
-------------
Gadget hit     "gadget GID [gadget specific data]"
 Read gadget information for specifics.

Help           "help GID MOUSEX MOUSEY<cr>"
 The mouse is over the gadget specified. The mouse location is useful in 
determining where to open a help window.

Keystroke      "key KEYCODE QUALIFIER<cr>"
 The user hit a key. Raw keycodes are returned along with the current 
qualifier.

Qualifier      "qual QUALIFIER<cr>"

 A change in the current qualifier is detected. Not all qualifier changes 
will cause events. HOWEVER the last qualifier event will ALWAYS be correct 
for the event(s) that follow it.

Close          "close CLOSESOURCE<cr>"
 The window has been closed.
 CLOSESOURCE=0        WindowClose Gadget
 CLOSESOURCE=-1       Closed by CTRL-BackSlash
else CLOSESOURCE=GID  Closed by GID

Commodity    "cx TYPE [SUBTYPE]"

 The Commodity object received a message.

AskClose   "askclose"

 User tried to close the GUI window. (not always used see window docs)

Refresh        "refresh"

 The window has been sized or altered and you should refresh any components 
you manually draw into the window. (You only ask for and watch these events 
if you use the 'Draw' modify command.)

Menu           "menu  MENU# ITEM# SUBITEM# CHECKED<cr>"

 Menu selected.
checked=0 Item is not checked
checked=1 Item is checked

 Be careful of false (undefined) menu hits.

Window Active  "active 0|1<cr>"
 0= window inactive
 1= window active

Application  "app FILENAME <cr>"

 An icon has been dropped on the window.

Iconify  "iconify MODE<cr>"

mode 0 = uniconify
mode 1 = iconify

Iconify events are only sent if modify is turned on. You must manually 
iconify or uniconify the window in this case. See window.doc.

If modify is not turned on the iconification is automatic and no iconify 
events are sent.

ARexx command  "arexx FID len <cr> command"

 You must first read the arexx event, the read len additional characters.

See the  docs for each gadget type for more information.


------------------------------------------------------------------------------
                                  4.4 Modify                                  
------------------------------------------------------------------------------

Modifying the GUI Window and its gadgets
=========================================

See the documentation for each gadget type for information on modifying that 
type of gadget type. This document exlains many 'special commands' that can 
be used to modify the GUI in general. It also has some commands that can be 
used on any gadget type.

Most modify commands are replied to with either 'ok' or 'error'. If more than 
one gadget parameter is changed by the modify command the reply can be 'ok ok 
...' .  A reply of a blank line means the modify command was not understood 
and was ignored.

Modify commands that change gadget parameters begin with 'id GID' Gadgets are 
modified with the following  line format

'id GID parameter1[=value] parameter2[=value] parameter3[=value] ...

example 'id 2 gadgettext="new text" disable=1'

The parameters allowed depend on the type of gadget that GID refers to.

NOTE: When modifying gadgets on a clicktab page, you should add the page 
parameter to the modify line.

NOTE: At times you may want to modify a GUI after is is created, but BEFORE 
the window is opened. Use the 'NoWindow' keyword in the window definition, 
create the GUI as usual. When you send 'open' the window does NOT open but 
you do go into modify mode. Modify the GUI then send 'id 0 s 64' to open the 
window after it has been modified.

Modify Parameters that can be used with all gadgets
(except menu, arexxhost, textattr, commodity...)
------------------------------

page="GID"

 Specify the clicktab gadget that controls the page containing the gadget to 
be modified. Most gadgets seem to modify fine without this being set, but it 
must be used for string gadgets. It should probably be used when modifying 
all gadgets on clicktab pages to ensure future compatability.
 NOTE: you supply the Gadget ID of the clicktab, NOT the number of the page 
inside the clicktab.

set

 'Set' sets gadget parameters from the supplied tag list. Both 'set' and 
'tags' must be used to do this.

tags="tags|data[|tag|data...]|0

 A list of tag and value pairs in HEX. Do not forget the trailing null !

Refresh (ref)

 Refresh the entire GUI when used alone, or refresh a specific object when 
used with a GID.

Informational Gadget modify instructions
----------------------------------------

read

  Read must not be used with other parameters besides GID.
 'id GID read' Reads the gadget specified by GID. The pipe returns the same 
information as when a user hits a gadget but without the leading 'gadget 
gid'. In the case of GID=0 read returns the windows 'left top width height' 
settings.

bounds

 Read the size and location of object associated with the GID. This modify 
command MUST be ' id GID bounds' and returns 'LEFT TOP WIDTH HEIGHT'

address

 Read the address of object associated with the GID and information about the 
gadget type. This modify command MUST be ' id GID address' and returns 
'ADDRESS GADGETTYPE'

 An address of 0 means no object is associated with the GID.

mouse

 Get the position of the pointer. This returns the both the position relative 
to the window and relative to the screen.

'windowX windowY screenX screenY'

Get="hexvalue"

 This special modify command lets you read a value associated with a gadget 
The pipe replies with 'ok value' when successful, a blank line if it fails.

 example 'id 3 get xxxxxxxx'

 This reads the selected color in a palette gadget (whose GID is 3).

Gadget interconnection modify
-----------------------------

 This function may only be useful to programmers already familiar with 
interconnection who have registered CA documentation.

Target="gadget_ID"  (tar=)

 The gadget to be interconnected with.

tags="tagsource|tagdest[|tagsource|tagdest..]|0

 The list of tags for interconnection in HEX. Tags must be in pairs, and do 
not forget the trailing null!

 example. 'id 3 target 2  tags="5001005|5001005|0" '

 Selections made on chooser gadget 3 are connected to chooser gadget 2.


Modify Control instructions
----------------------------

 Some modify commands do not actually modify any gadgets.

pointer

 Set the pointer for the window, if pointerdata is not specified set the 
pointer to default pointer. I pointer data is given see below.

pointerdata="height|width|hotx|hoty|data1|data2|..."  (pd=)

 Pointer data is the definition for a pointer. For more information see the 
intuition call SetPointer(). Pointerdata="" is a special case setting the 
pointer to a null (invisible) pointer.

specialchar="character" (sc=)

 'Character' is a single character that replaces '|', in use as a separator 
inside parameters like chooserlabels, tags, penmapdata, ...

 You should usually use this alone on a modify line, used inside modify 
commands like add node it will cause an extra 'ok' in the response line.

Quiet  (q)

 Tell the pipe not to reply to the modify commands. This is actually a toggle 
switch turning replies off and on. SOME modify commands are ALWAYS replied 
to. (addnode and getfile selected 0|1)

refresh (ref)

 Refresh the gadget referenced by GID. The refresh command can be combined 
with any other modify command and is always executed last. GID=0 will refresh 
the windows root layout, this is the best way to refresh all gadgets.

 Refresh without a GID specified will refresh the entire window, usually it 
is better to refresh the root class as described above.

close

 Close the CA window. Dispose of window and end the pipe connection to the 
GUI host.

tick=number

 End the modify conversation, Reply with a tick event after number/100 
seconds.

Continue (con)

 End the modify conversation.

Modifyoff (m)

 End the modify conversation AND turn modify off. (do not start any new 
modify conversations). Note there will be no way to turn modify back on.

Beep=num

 Beep the display. If num =0 beep all screens , else beep the GUI's screen.


Bubble Help
------------

Help="num"

 If num =0 turn help events off, if num!=0 then turn help events on.

 Each GUI can only show one bubble help window at a time.

bubble top=numx left=numy gt="Help Text"

 This opens a bubble showing the help text. Top and left are mouse location 
for the help (as sent to you in the help event you are responding to). Any 
previous help window will be closed.

 'bubble' sent with no parameters will close the bubble with out opening a 
new one.

Image Functions
----------------

FreeImage="num"  fi=

 if num=-1 Dispose of a previously defined image without using it. Else free 
the root bitmap image in buffer num. Be careful not to do this while images 
still exist that reference this root bitmap.

Draw="num" top="num" left="num" [target=GID][nozz][noclip]

 Draw an image into the gui. Num is the number of the predefined image to be 
drawn. You MUST set 'top' and 'left' and can also set

target=GID

 Reference (clip & offset) drawing to inside the object specified by GID. If 
target is not given drawing is refrenced to inside the borders of the GUI.

 nozz

 Make top and left relative to the whole window rather than the inner panel 
or specified target.

noclip

 Allow images to overwrite the entire window, borders and all.

 The image number relates to images you have created but not used in your 
GUI.
 For example...

 You create an image 'bitmap fn="cat.gif"'  it is image 0.
 You create another image 'bitmap fn="dog.gif"' it is image 1.
 You create another image 'bitmap fn="bird.gif"' it is image 2.

 You create a BUTTON using the last image created 'button useimage', the
 button used the bird image so it is no longer in the image list.

 You create another image 'bitmap fn="frog.gif"' it is image 2.

 You now have 3 images available to draw

 0 cat
 1 dog
 2 frog

 Drawing images DOES NOT remove images from the image list. Incorporating 
images directly in your GUI DOES remove images from the image list. The image 
number is NOT related to the buffer number in the bitmap image parameters.


GID 0
-------

GID 0 is used to specify the GUI window itself. It can be used to control 
certain aspects of the window. (see window docs)

Defining new gadgets during modify
------------------------------------

define

 This causes the current line to be used as a Gadget definition statement 
rather than modify. You can add or replace gadgets in the already opened 
window. You may need to send a refresh modify command to make the changes 
visible.

replace="GID"

 The newly defined gadget replaces the existing gadget specified by GID. The 
pipe tries to free the resources used by the previous gadget right away, but 
some memory is not freed until the pipe is closed.

 WHEN USING REPLACE DO NOT ASSUME WHAT THE RESULTING GID OF THE NEW GADGET 
WILL BE. The usual sequence of allocated gadget ID's is not followed. 
Replacing a layout group frees all gadgets in the group as well as the layout 
itself. Replacing a listbrowser frees its nodes.

 You MUST keep track and not try to access gadgets that no longer exist.

 It may be better to close the window and open a new one rather than using 
replace or define. On the other hand some pretty neat thing can be done using 
define and replace. ;-D



------------------------------------------------------------------------------
                               4.5 GUI Tutorial                               
------------------------------------------------------------------------------


------------------------------------------------------------------------------
                                 4.5.1 Design                                 
------------------------------------------------------------------------------

 Working through these tutorials in order is the best way to learn to build 
GUI's with AWNPipe. A few minutes here will save you hours of development 
time later.

 TUTORIAL 1
-----------

Building GUIs can be VERY easy, This first tutorial will develop a simple 
GUI.

Create a simple 4 line text file called first.gui. (You can use drag 
selection and Right-Amiga-C to copy text from these docs.)

 title "My first GUI" defaultgadgets
 button gadgettext "YES"
 button gt "NO"
 open

Now, in a shell, type 'copy first.gui awnpipe:/xc'.

That was easy. You already guessed that gt was a short form for gadgettext.

Now we want to see what events the GUI sends. We can direct the events to a 
con by adding 'wcon:' to the end of the pipe name. Try

'copy first.gui awnpipe:/xcwcon:'

Look at the output in the con:. Notice that the pipe replies to each line of 
the definition file, as well as sending events.

Now add a little text to the gui. We will also provide keyboard shortcuts for 
the gadgets.

 title "My first GUI" defaultgadgets
 label  gt " Select YES or NO "
 button gadgettext "_YES"
 button gadgettext "_NO"
 open

That worked, but it looks a little UGLY. Let's try a vertical layout instead 
of the default horizontal layout.

 title "My first GUI" defaultgadgets  vertical
 label  gt " Select YES or NO "
 button gadgettext "_YES"
 button gadgettext "_NO"
 open

The GUI is starting to look better, but we really want the two gadgets 
side-by-side. To do that, we will use a layout group. ("le" is short for 
"layout end".)

 title "My first GUI" defaultgadgets  vertical
 label  gt " Select YES or NO "
 layout
 button gadgettext "_YES"
 button gadgettext "_NO"
 le
 open

That is much better! The GUI looks good, but it would be nicer if the window 
closed after the user selected yes or no. (You should also notice that the 
layout received a GID number, so yes and no are now gadget 2 and 3.)

 title "My first GUI" defaultgadgets  vertical
 label  gt " Select YES or NO "
 layout
 button gadgettext "_YES" close
 button gadgettext "_NO" c
 le
 open

It's done and it might even be useful.

Since we have a working GUI, let's use it to see a few other types of events 
the GUI can generate.

 title "My first GUI" defaultgadgets  vertical  sendkeys sendqual help state
 label  gt " Select YES or NO "
 layout
 button gadgettext "_YES" close
 button gadgettext "_NO" c
 le
 open

Activate and deactivate the window. Hold the mouse over each gadget. Type a 
few keys. Try the shift, alt etc.



------------------------------------------------------------------------------
                               4.5.2 Operation                                
------------------------------------------------------------------------------

This tutorial has two versions, Arexx and 'C'. The 'C' tutorial is after the 
Arexx one.

Before reading further, take a moment to run the tutorial so you understand 
what the program does.

TUTORIAL 2 ARexx
----------------

 Now that we know how to designed a GUI we want to be able to operate one. To 
follow this example you need a basic knowledge of ARexx. Have a look at the 
file Tutorial2.rx in the demos drawer.

 The program flow is straight forward. 3 simple steps.

1. Default values are set. These are the values of the gadgets when the GUI 
opens.

2. A routine (buildgui) is called to write the GUI definition to the pipe. 
(More on this routine later)

3. Events are read from the pipe and processed until the stream of events 
ends.

BUILDGUI

 The 'buildgui' routine contains the information defining the GUI window and 
its gadgets. The data is sent line by line to the 'topipe' routine which 
sends the data to the pipe, checks for errors, and returns the GID returned 
by the pipe. (more on 'topipe' later.)

 For most lines sent with 'topipe' the response is ignored. For gadget 
definitions however the return value is stored so we can identify gadget 
events later on.

TOPIPE

 This routine takes a line of text and writes it to the pipe. The pipes 
response is read. If everything is ok the second parameter of the response is 
returned. This is the GID if a gadget is defined and a null string in most 
other cases. If an error occurs the problem line is output and the script 
exits.

 You should use this routine or one like it when writing your own script for 
AWNPipe. It will help avoid common errors and make debugging much easier.

EVENT HANDLING

 The main loop reads an event from the pipe and parses it into its parts. The 
first word of an event always tells the event type. This information is used 
to call a routine for that type of event.

CLOSE EVENT

If a close event is received write a little text and then exit the script.

GADGET EVENT

 We check the second word of the event to see which gadget sent the event. 
For most gadgets we store event information and return. If the cancel gadget 
is the cause of the event we output some text and exit. If it was the done 
gadget we output the information for each gadget and exit. If it was the 
reset gadget we close the pipe, then create the gui again to restore the 
default values.

MENU EVENT

 The second word of a menu event is the menu number, the third word id the 
item number, and the forth the subitem number. This information is used to 
determine what action should be taken in response to an event.

 Almost any GUI can be operated using this approach demonstrated in this 
tutorial. Use these functions as building blocks in your own scripts.

TUTORIAL 2 in C
----------------

The files tutorial2.c and tutorial2 can be found in in the demos drawer.

 Now that we know how to designed a GUI we want to be able to operate one. To 
follow this example you need a basic knowledge of 'C'. Have a look at the 
file Tutorial2.c in the demos drawer. We will examine each of the functions 
in detail since they will be useful building blocks for making other GUIs. 
There is only 1 interesting structure.

struct GUIpipe myGP

This structure is used to manage the GUI. It contains the GUIs file handle, 
error status,and read buffer. It as has storage for some useful data parsed 
from replies or events.

 int main( int argc, char *argv[]);

 The program flow is straight forward. Default values are set. We call a 
routine to build the GUI and operate the gui if we built it successfully. To 
operate the GUI we simply read events and react to them. Before we exit we 
make sure the GUIs filehandle is closed.

 int getline(struct GUIpipe * GP);

 We need to handle text one line at a time when operating the GUI. This 
routine reads the pipe making a sure a full line is available before 
returning. It will remove the previous line from the buffer first if there 
was one. We delimit the line with a null byte so we can use it as a string in 
other functions.

 __stdargs int topipe(struct GUIpipe * GP, UBYTE * data,...)

 Again and Again you will need to write a line to the pipe and read the 
response. This routine does that for you. It writes data to the pipe and then 
reads a reply from the pipe. The reply line is parsed, and an error is 
flagged if the first part of the reply is not 'ok'. We return the value of 
the second reply part if all is ok, return 0 if an error occurred.

 topipe allows Printf like formatting of data written to the pipe (VFPrintf 
is used). The regular Printf formats are supported. This is not needed in 
this example but it will be very useful as we expand the program in the other 
tutorials.

 int buildgui(struct GUIpipe * GP);

 All the information that defines the GUI is contained in this function. It 
opens a filehandle on the AWNPipe device and returns an error if this fails. 
The window and gadget definitions are written to the pipe and the returned 
gadget ID's are stored. If all gadgets are created ok the window is opened. 
The final error status of the GUI is returned.

int getevent(struct GUIpipe * GP);

 This routine reads a line from the pipe and parses it storing information 
about the event. It returns the error status of the pipe.

 int gadgets(struct GUIpipe * GP);
 int menu(struct GUIpipe * GP);

 These routines look at the information parsed from the last event and take 
appropriate action depending which gadget or menu item was selected. Some 
times the gadget state information from the event is stored. Other times 
information is output to the user.

 int gperror(struct GUIpipe * GP,int error);

 When an error is detected while reading or writing to the pipe this routine 
is called. It sets the error status and alerts the user an error has 
occurred.

 UBYTE * eventstr(struct GUIpipe * GP, int num);

Some fields in events , like string gadget contents, can contain spaces. This 
functions returns a pointer to the 'num' word of the event. Since the line is 
delimited by a null you can treat this as a string pointer. If the 'num' word 
is not found NULL is returned. The pointer is only valid until the next call 
to getline(), getevent(), or topipe().

 Almost any GUI can be operated using this approach demonstrated in this 
tutorial.

------------------------------------------------------------------------------
                              4.5.3 Modification                              
------------------------------------------------------------------------------

 Before reading this section take a moment and run tutorial 3, knowing what 
the GUI does will help in understanding the code behind it.

This tutorial has two versions, Arexx and 'C'. The 'C' tutorial is after the 
Arexx one.

TUTORIAL 3 AREXX
---------------

 This tutorial deals with modifying a GUI after it has been opened. You 
should make sure you understand tutorial 2 before reading further.

 Three new gadgets have added to the gui. The load and save gadgets on the 
lower left, and a get file gadget that you do not see. The getfile gadget is 
unattached (ua) so it is not displayed in the gui. More on the getfile gadget 
later.

 The window definition line (in buildGUI:) has the modify option added to it. 
This means the pipe will look for modify commands after you fist open the 
window, and after each event is sent. Any number of modify commands can be 
written to the pipe, including 0 (none). After writing the modify commands 
'continue' must be sent to the pipe to tell it to start sending events. After 
you get an event the pipe starts waiting for modify commands again.

 Only two changes are made in the program flow.

1.  After BUILDGUI is called to build and open the window we send a modify 
command to the pipe.

topipe('id 'savegad' dis 1 ref')

 The id specifies the save gadget, 'dis 1' disables it, and 'ref' refreshes 
it so the changes will show. (we want the save gadget disabled because the 
name gadget is empty at start up, and we need a name before we can save).

2. In the mail loop a 'continue' is written to the pipe BEFORE we wait for an 
event. This tells to pipe to stop looking for modify commands and send an 
event.

 After an event is read from the pipe it automatically starts looking for 
more modify events. This means that modify commands can be used immediately 
after receiving an event from the pipe.

 RESETFORM

 In tutorial 2 we had to close then open the GUI to reset its contents. With 
modify commands we can do this with the gui remaining open. The function 
resetform is near the end of tutorial3.rx.

 This function sends a modify command for each of the gadgets resetting them 
to the default values. It also disables the save gadget.

 SAVEFORM

 This function is called when the user hits the save gadget. It writes the 
forms contents to a file in 't:'. The files name is the text from the name 
gadget with '.formdemo' appended to it. The save gadget is disabled unless 
the name gadget contains text. See the handling of namegad in the GADGET: 
routine.

 LOADFORM

 This function makes use of the unattached GETFILE gadget. A modify command 
is used to set the file name in the file requester, and to open the requester 
itself. The pattern used in the file requester was set when the gadget was 
created in the BUILDGUI routine.

call writeln(ca,'id 'getfilegad' fn "t:" s 1')

'fn "t:"' sets the file requester to the drawer T:. 's 1' opens the 
requester.

 The return from the pipe to this modify command is read and parsed to get 
the file selected and to test if the user selected a file or aborted the 
requester. The reply from the pipe is ...

SUCCESS ["filename"]

 Success is 0 if the user aborts the file requester, non zero if a file is 
selected. The file name is always returned in quotes since multiple files can 
be selected in some situations. (but not this situation).

 If the user selected a file, it is opened and the contents placed in the 
GUI. No error checking is done on the file in order to keep the tutorial 
clear and easy to understand.

TUTORIAL 3 in C
---------------

 This tutorial deals with modifying a GUI after it has been opened. You 
should make sure you understand tutorial 2 before reading further.

  int buildgui(struct GUIpipe * GP);

The window definition line (in buildgui()) has the modify option added to it. 
This means the pipe will look for modify commands after you fist open the 
window, and after each event is sent. Any number of modify commands can be 
written to the pipe, including 0 (none). After writing the modify commands 
'continue' must be sent to the pipe to tell it to send an event. After you 
get an event the pipe starts waiting for modify commands again.

 Three new gadgets have added to the gui. The load and save gadgets on the 
lower left, and a get file gadget that you do not see. The getfile gadget is 
unattached (ua) so it is not displayed in the gui. More on the getfile gadget 
later.

 int main( int argc, char *argv[]);

 Only two changes are made in the program flow.

1.  After buildgui() is called to build and open the window we send a modify 
command to the pipe.

     topipe(GP,"id %ld dis 1 ref\n",savegad);

 The id specifies the save gadget, 'dis 1' disables it, and 'ref' refreshes 
it so the changes will show. (we want the save gadget disabled because the 
name gadget is empty at start up, and we need a name before we can save).

2. In the main loop a 'continue' is written to the pipe BEFORE we wait for an 
event. This tells to pipe to stop looking for modify commands and send an 
event.

 After an event is read from the pipe it automatically starts looking for 
more modify events. This means that modify commands can be used immediately 
after receiving an event from the pipe.

 int gadgets(struct GUIpipe * GP);

 The 'loadgad' and 'savegad' gadgets are recognised, and the handling of 
'namegad' and 'resetgad' have changed.

 In tutorial 2 we had to close then open the GUI to reset its contents. With 
modify commands we can do this with the gui remaining open. We set our 
default form information and call updategui().

 Namegad enables or disables the savegad. If no name is set we can not 
generate a filename to save the information to.

int updategui(struct GUIpipe * GP);

 This routine updates the GUI to show the values we have stored internaly. A 
modify line is sent for each gadget. The function updateform is near the end 
of tutorial3.rx.

 int saveform(VOID);

 This function is called when the user hits the save gadget. It writes the 
forms contents to a file in 't:'. The files name is the text from the name 
gadget with '.formdemo' appended to it. The save gadget is disabled unless 
the name gadget contains text. See the handling of namegad in the gadget() 
routine.

 int loadform(struct GUIpipe * GP);

 This function makes use of the unattached GETFILE gadget. A modify command 
is used to set the file name in the file requester, and to open the requester 
itself. The pattern used in the file requester was set when the gadget was 
created in the BUILDGUI routine.

   FPrintf(GP->file,"id %ld fn \"t:\" s 1\n",getfilegad);
   if (getevent(GP)) return(1);


'fn "t:"' sets the file requester to the drawer T:. 's 1' opens the 
requester.

 The return from the pipe to this modify command is read and parsed as an 
event since it does not return the usual 'ok'. The reply from the pipe is ...

SUCCESS ["filename"]

 Success is 0 if the user aborts the file requester, non zero if a file is 
selected. The file name is always returned in quotes since multiple files can 
be selected in some situations. (but not this situation).

 If the user selected a file, it is opened and the contents parsed into out 
internal form information. Then updategui() is called.. No error checking is 
done on the file in order to keep the tutorial clear and easy to follow.


 __stdargs int topipe(struct GUIpipe * GP, UBYTE * data,...);
 int getline(struct GUIpipe * GP);
 int gperror(struct GUIpipe * GP,int error);
 int getevent(struct GUIpipe * GP);
 int menu(struct GUIpipe * GP);
 UBYTE * eventstr(struct GUIpipe * GP, int num);
 VOID setdefaults(VOID);

 These routines have not been changed from Tutorial 2.


------------------------------------------------------------------------------
                                 4.5.4 Extras                                 
------------------------------------------------------------------------------

 If you have read the first three tutorials, but not tried building a GUI of 
your own, you should try writing a simple gui of your own before reading 
further. Tutorial 4 will be simpler to understand once you have gained a 
little experience with AWNP.

 Before reading this section take a moment and run tutorial 4, knowing what 
the GUI does will help in understanding the code behind it.

 Although Tutorial 4 is available in 'C' or Arexx the discussion is kept 
general and it applies to both.

TUTORIAL 4
-----------

 This tutorial deals with adding some of the finishing touches to AWNP GUI's. 
You should make sure you understand tutorial 3 before reading further.

 A few simple changes are made in the GUI. It has an iconify gadget and can 
be resized. This is done by adding 'ig' iconfygadget, 'sg' sizegadget and 
'ii' iconimage. 'ii' specifys the file (without the .info) whose icon is used 
when iconfying the GUI, it can be omitted and default icon will be displayed. 
The 'fh' fixheight limits the sizing gadget to changing the GUI's width.

 Another change has been made in the GUI, it is set as an app window 
'app'.Now when an icon is dropped on the gui (or its iconified image) an 
event is generated passing the file name of the icon that was dropped. The 
event is 'app path:filename'.

 We respond to the app event by uniconifying the GUI (if necessary) and 
loading the file that was dropped. Try saving some info then dropping the 
icon of the saved info on the GUI.

 The iconify gadget also produces a special event. 'iconify MODE' where 
MODE=1 means the user wants to iconify the GUI, and 0 means it should be 
uniconified. A simple modify line does this.

'id 0 s 32' to iconify
'id 0 s 64' to uniconify

 The menu now has options to snapshot the window. The windows size and 
location are read with

'id 0 read' the pipe responds with
'TOP LEFT WIDTH HEIGHT'   not with 'ok'

 The information is stored in ENV(ARC): . Before the GUI is opened we check 
for the information and use it in the window definition line if its 
available.

 The about item in the menu now opens a separate GUI. It is a simple window 
with no gadgets just a label used to display some text. Although the routine 
used to build the about GUI is trivial it has an interesting ability. It can 
be made to close automatically after a specific delay.

 A gui window will close automatically if it tries to read a modify command 
and you have already closed your end of the pipe. We open the GUI then send a 
'tick' modify command to the pipe. This works like 'continue' except the pipe 
will send back our tick as an event weather the user hits a gadget or not. 
After sending us the tick event back AWNP tries to read a modify command and 
THEN discovers we have closed the pipe. If the delay is set as 0 we simply 
turn modify off and the GUI waits until the close gadget is hit.

 The data menu items now display information the same way the about requester 
does.



------------------------------------------------------------------------------
                                4.5.5 Advanced                                
------------------------------------------------------------------------------

 Tutorial 5 adds new functions, Bubble Help, an arexx host, tooltypes and 
commodity. Although they are advanced features by now it should be easy for 
you to follow the logic. They work in very similar ways to the other objects 
you have learned to deal with. Adding these sort of features to your own 
GUI's will help make them Quality programs.

 Before reading this section take a moment and run tutorial 5, knowing what 
the GUI does will help in understanding the code behind it.

 Tutorial 5 is only available in Arexx for now, the discussion is kept 
general and it applies to both 'C' and ARexx.

TUTORIAL 5
-----------

 Most users only scan documentation at best. To allow users to quickly 
understand your programs Bubble help is very useful.

 A few simple changes are made in the window definition. It now tells the GUI 
to send help and window activation events.This is done by adding 'help' and 
'state' keywords.

 A menu option has been added to turn the help bubbles on or off.

 A change has been made in the main loop, we send 'tick 50' rather than 
continue when we want to get an event from the pipe. Like continue this ends 
the modify command part of the conversation and tells the GUI to send us an 
event. It also forces the GUI to send us a 'tick' event after 50/100 of a 
second. We use these tick events to delay the displaying of help bubbles.

 Tick events have other uses, like returning control back to your code after 
a set delay so it does not wait forever for an event. For now we will just 
look at the help delay.

 Each time an event is read in the main loop we check a delay counter. If the 
counter counts down to 0 we open a help bubble (using some previously stored 
information). The HELPX and HELPY are used to determine a position for the 
bubble and MUST be given.

'bubble top HELPX left HELPY gt "HELP TEXT"'

 We also must handle new events, help, arexx, cx and active.

 We respond to the help event by calling the bubble routine. This routine 
checks to see if the help event is the same as the last one. If yes we do 
nothing. If it changed we close the old help window, if we had one, by 
sending a bubble modify command with no parameters.

'bubble'

 If the event was gadget 0 or -1 we have nothing more to do since they 
represent the mouse not being over a valid gadget. If the gadget number is 
valid we store the mouse position that is returned in the help event and the 
gadget number. We start the delay counter and return.

 If we receive any activation event, or iconify the gui, we call bubble(0) to 
close any open bubble help. This needed in case our window becomes inactive 
due to another window being opened.

 An arexx host has been added to the GUI. The ARexx host name is 'TUTORIAL5'. 
This allows a few things.

 topipe(' arexx gt "TUTORIAL5|age|sex|knowledge|front|quit"')

 If upon startup the host already exists we know tutorial 5 is already 
running so the already running gui and brought to front rather than a second 
occurrence of tutorial 5 being opened.

 The following arexx commands are supported.

 front -bring the window to front.
 quit  -quit tutorial5
 age [#]  -read or set the age
 sex [#]  -read or set the sex
 knowledge [#] -read or set knowledge
 (See the rxhst: routine)

 Tutorial 5 is also a commodity.

topipe('commodity cxname Demo5 cxtitle="AWNPipe demo 5" cxdesc="Disable 
Enable ignored..." cxhotkey="ctrl alt 5"')

It supports a hotkey (ctrl alt 5), show or hide the gui, and remove. 
Enable/disable are ignored as they make no sense in the context of Tutorial 5 
...
(See the commodity: routine)

TOOLTYPES

 Tooltype reading is actually not part of the AWNPipe GUI host, its a 
completely different host inside AWNPipe. Since tooltypes are desirable for 
almost all programs it has been added to this tutorial. You find the function 
simple to use.

Reading tooltypes

 The tooltypes are read by a function called tooltypes:. First the path to 
our program is found using 'parse source'. Then a special pipe is opened 
'awnpipe:name/xtPATH:PROGRAM'. A line containing the tooltype we wish to 
check is written to this pipe. If the tool type is found we will read back 
from the pipe 'ok VALUE' where VALUE is the value associated with the tool 
type we asked for. If the tooltype is not found we read back a <cr> (empty 
line).

 When all the tooltypes have been checked we simply close the pipe connection 
to the tooltype host.

 In tutorial5 the windows size/position and bubble help setting are now kept 
as a tooltype.

There are also tooltypes to preset the age, knowledge, sex and name. You can 
force the window to iconify after opening with the iconify tooltype.

Writing tooltypes


------------------------------------------------------------------------------
                                  4.5.6 Tips                                  
------------------------------------------------------------------------------

 A few quick hints about building and debugging AWNP applications.

Before writing an AWNP GUI application prototype the GUI with a simple text 
file (mygui). Use
'copy mygui awnpipe:pipename/xcwcon:'

This speeds up testing of layout changes! Also note you can comment out lines 
in your file by starting them with ';'. Any line with a semicolon in the 
first position is ignored.

--

 NAME YOUR PIPES !

 Rather than opening 'awnpipe:/xc' provide a unique name. Use 
'awnpipe:PipeName/xc'.

 A common problem when developing an AWNP application is to find the pipe 
conversation hangs. Usually this means your program is trying to read data 
from the pipe, and the pipe is trying to read data from your application. (a 
read is pending on both ends of the pipe).

 This can be cleared by issuing a simple shell command.

'echo >awnpipe:PipeName/a'

 Both reads are aborted and AWNP usually notices a problem and exits cleanly.

--

 Some times it will be useful to trace the conversation your program has with 
AWNP. Again this can be done with a simple shell command.

'type awnpipe:PipeName/t/i'

 All data passing either way through the pipe will be output. When your 
program exits the type command will return. ( this is not limited to to GUI 
applications. It works for ALL awnp connections!)

 You can also use

'copy awnpipe:PipeName/t/i mylogfile'

 This saves the conversation to the logfile of course.

 You can use both at the same time, in fact you can 'twin' the data stream as 
many times as you like.

 Some times during testing you might create a GUI with no close gadget, you 
can usually close ANY GUI with 'control backslash' like you can with a con:.

--

 In general you can not assume that you can modify all the parameters you can 
define for objects. Also in some cases the parameter names or usage may be 
different in the modify command when compared to the definition line.

------------------------------------------------------------------------------
                                   5 Demos                                    
------------------------------------------------------------------------------

 Several GUIs of example gadgets can be viewed by running the Gadgets# in the 
demos drawer inside AWNP-Docs. To generate these GUIs a simple text file is 
being copied to a GUI generating pipe. The 'wcon:300//200/200/PipeEvents' at 
the end of the pipe name simply sends the output of the pipe to a con so you 
can see what is going on.

 Some example scripts using pipe generated GUIs are also in the demo drawer. 
These demos are mostly ARexx or ADOS scripts. Load them in your text editor 
and take a look at them. I think you will find they are very simple script 
considering the powerful GUIs they create. Reading the comments in the 
scripts should help you when learning to build and operate your own AWNPipe 
GUIs.

---

 CAList is an ADOS script. It is graphical wrapper for the standard list 
command. It is a VERY simple script. Put it in 'C:' with its script bit set 
if you like it enough to make regular use of it. Use 'calist ?' to get a 
usage display.

 This script gives a good example of how to build a simple gui. It shows how 
much can be accomplished  in a short script.

---

 Form is an ADOS script that displays a form. Use 'execute Form' or set the 
script bit for the file and simply type 'form'.

 This gui is truly interactive and requires the name to be set before the 
form is accepted. It allows resting of the form and knows when the user 
aborts.Its rather extreme for an ADOS script but is included to show you just 
how much can be accomplished with ADOS and AWNPipe working together. ADOS 
wizards may find the handling of the event file and environment variables 
interesting.

---

 Fonttoy is an ADOS script to play with fonts. Use 'execute FontToy' or set 
the script bit for the file and simply type 'fonttoy'.

 This script creates a very simple gui. However it uses gadget 
interconnection to do some magic that only experienced GUI developers are 
likely to understand. It also uses numerical tag values, you will likely 
never do this. Note that numerical tags CAN be used with defining AWNPipe 
GUIs and this means you will be able to access new CA/Reaction features as 
they come out without changes to AWNPipe.

---

 Dict-thesar.rx is an arexx script. It is run from its icon or shell. words 
are search in the Merriam Webster site so you must be online. The menu will 
start and control miami if you have it installed. Bubble help is provided and 
it is simple to use so no real docs are needed.

You should find this tool useful enough to keep installed on your system.

---

 xo.rx is an arexx script. Use 'rx xo.rx' to run it. You must 'cd' into the 
demo drawer first so it can find its image file (xo.gif). It does not play 
against you so you must  play both sides of the game. (click in the squares).

 It changes the button images in a operating GUI. It shows how to create 
multiple images from a single source image. It also lets you see how to 
modify a gui after it has been opened. An additional gadget is even added to 
the GUI after it has been opened. Take a look at xo.gif in an image viewer, 
you may be surprised to see how small the image is.


---

 DropBox.rx can be run from its icon or by typing 'rx dropbox.rx' in a shell. 
Looking at the tooltypes of Drop box should help you understand what is going 
on. You set tooltypes to tell the program what to do with files or drawers 
that are dropped on it. I hope it is something you will keep around and be 
able to make use of. With a little modification it could be very powerful 
indeed.

 The gui is so simple it almost unbelievable, however it is an app window. 
That makes it very special. The script also makes heavy use of AWNPipes 
ability to do pattern matching. Finally the script will also teach you how to 
read tooltypes using AWNPipe.

Possible tool types.

pat (pattern)=YourCommandText

This tells dropbox  to execute your command for any files that match the 
pattern you have set. '%f' in the command is replaced by the name of the file 
that was dropped on dropbox.

pat (pattern)=drawer

Tells DropBox to use its default drawer handling for that pattern.

pat (pattern)=image

Tells DropBox to use its default image handling for that pattern.

pat (pattern)=text

Tells DropBox to use its default text handling for that pattern.

bin BinaryPattern=YourCommandText

This tells dropbox  to execute your command for any files whose first 12 
bytes match the binarypattern you have set. '?' is the only wildcard allowed 
in the BinaryPattern. '%f' in the command is replaced by the name of the file 
that was dropped on dropbox. iconify

A tooltype of 'iconify' tells DropBox to iconify itself as soon as it is run. 
You can still drop files on the iconified window to have dropbox process 
them.

multi

A tooltype of 'multi' tells DropBox to allow files dropped on it to have more 
than one command run for them. The default is for dropbox only to only 
respond once to each file dropped.

---

 The first real projects to use AWNPipe GUIs were some aweb utilities.

CacheControl.awebrx allows you to micro manage AWebs caching of websites.

Put the script and CacheControl_doc.html in AWeb3:plugins, it may be called 
directly from the ARexx menu or from an AWeb button.

GUI Button
name            CCtrl
command         run awebpath:plugins/cachecontrol.awebrx

ARexx Menu
title           CacheControl
macro           awebpath:plugins/cachecontrol.awebrx

---

AWebModes.awebrx allows you to easily control many of AWebs settings. 
Gabriele Favrin has kindly allowed a version of it to be included here. Put 
the script and AWebModes_Doc.html in AWeb3:plugins, it may be called directly 
from the ARexx menu or from an AWeb button.

GUI Button
name            Modes
command         run awebpath:plugins/AwebModes.awebrx

ARexx Menu
title           AWebModes
macro           awebpath:plugins/AWebModes.awebrx

---

DropZone.awebrx opens an appwindow on WB so you can drag and drop files to be 
displayed in AWeb, even while aweb is on its own screen. Put the script and 
DropZone_Doc.html in AWeb3:plugins. It may be called directly from the ARexx 
menu or from an AWeb button.

GUI Button
name            DZone
command         run awebpath:plugins/DropZone.awebrx

ARexx Menu
title           ChangeModes
macro           awebpath:plugins/DropZone.awebrx

